Он говорит, что браузер отправил запрос, который сервер не мог понять. Я не совсем понимаю, что пошло не так в моем PHP-коде. Может кто-то, пожалуйста, помогите мне понять, где я ошибся. Благодаря !
<?php $url ="http://127.0.0.1/sensor/sens/data.php"; $xml_data = file_get_contents("/usr/local/www/data/data.xml"); $header ="POST HTTP/1.0 \r\n"; $header .="Content-type: text/xml \r\n"; $header .="Content-length: ".strlen($xml_data)." \r\n"; $header .="Content-transfer-encoding: text\r\n"; $header .="Connection: close \r\n\r\n"; $header .= $xml_data; $ch = curl_init(); curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST,true); curl_setopt($ch,CURLOPT_POSTFIELDS,$header); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 4); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header); $data = curl_exec($ch); // if the post is successful , the server will return some data. echo $data; #$info = curl_getinfo($ch); # #if(!curl_errno($ch)) # echo 'It took '.$info['total_time'].'seconds to send a request to'.$info['url']; # # else # curl_close($ch); echo $data; ?>
Я думаю, проблема CURLOPT_POSTFIELDS
с CURLOPT_POSTFIELDS
Из руководства PHP …
Полные данные для отправки в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Тип файла может быть явно указан, следуя имени файла с типом в формате '; type = mimetype'. Этот параметр может быть передан как строка с urlencoded, например 'para1 = val1 & para2 = val2 & …', или как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, значение должно быть массивом, если файлы передаются этому параметру с префиксом @.
http://php.net/manual/en/function.curl-setopt.php
Он должен содержать только полезную нагрузку, а не весь заголовок.
Вам не нужно создавать пользовательский запрос, используя cURL для выполнения этого запроса, достаточно обычного HTTP POST. Другая часть проблемы заключается в том, что вы также устанавливаете POSTFIELDS
и пользовательский запрос на ту же самую вещь, которая была POSTFIELDS
HTTP-запросом, поэтому весь запрос состоит в основном из двух повторяющихся строк.
Попробуйте этот код и изучите его, чтобы понять, как он работает:
<?php $url = "http://127.0.0.1/sensor/sens/data.php"; $xml_data = file_get_contents("/usr/local/www/data/data.xml"); $headers = array('Content-Type: text/xml', 'Content-Transfer-Encoding: text', 'Connection: close'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 4); $data = curl_exec($ch); // if the post is successful , the server will return // some data. echo $data; // info = curl_getinfo($ch); // // f(!curl_errno($ch)) // echo 'It took '.$info['total_time'].'seconds to send a request // to'.$info['url']; // // else // curl_close($ch); echo $data;