Я делаю бронирование онлайн-отелей с помощью проекта xml api (php). Когда я работаю в коде бронирования, он показывает ошибку следующего
"Warning: file_get_contents(https://...@gmail.com</email><firstName>test</firstName><lastName>smith</lastName><homePhone>8870606867</homePhone><creditCardType>CA</creditCardType><creditCardNumber>5401999999999999</creditCardNumber>....</HotelRoomReservationRequest>) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 411 Length Required"
его мой код
$context = stream_context_create( array( 'http' => array( 'method' => 'POST', 'header' => "Content-type: application/x-www-form-urlencoded", "Accept: application/xml" ) ) ); $url ='https://book.api.ean.com/....'; $xml = file_get_contents($url, false, $context);
Это для отправки кредитной информации PLZ любезно дать мне предложение какой тип ошибки ….
Согласно RFC2616 10.4.12 :
10.4.12 411 Length Required The server refuses to accept the request without a defined Content- Length. The client MAY repeat the request if it adds a valid Content-Length header field containing the length of the message-body in the request message.
Вам нужно добавить заголовок Content-Length
в свой POST
запрос. Это размер в байтах (октетах) вашего тела запроса POST. Чтобы получить длину, вы можете использовать strlen
в теле POST. Поскольку в вашем примере кода не отображается тело POST, трудно привести конкретный пример. Тело сообщения передается с записью ['http']['content']
в контексте потока.
Вероятно, этого уже достаточно, если вы установили запись content
(см. Параметры контекста HTTP ).
Изменить: Следующий пример кода может решить вашу проблему. Он демонстрирует, как отправить XML-код на сервер через запрос POST с использованием file_get_contents
и заголовков настроек, включая заголовок Content-Length
.
$url = 'https://api.example.com/action'; $requestXML = '<xml><!-- ... the xml you want to post to the server... --></xml>'; $requestHeaders = array( 'Content-type: application/x-www-form-urlencoded', 'Accept: application/xml', sprintf('Content-Length: %d', strlen($requestXML)); ); $context = stream_context_create( array( 'http' => array( 'method' => 'POST', 'header' => implode("\r\n", $requestHeaders), 'content' => $requestXML, ) ) ); $responseXML = file_get_contents($url, false, $context); if (FALSE === $responseXML) { throw new RuntimeException('HTTP request failed.'); }
Если вам необходимо улучшить управление ошибками, см. ignore_errors
контекста HTTP-протокола ignore_errors
Docs и документы $http_response_header
. Подробная обработка заголовков HTTP-ответов доступна в моем блоге: HEAD сначала с PHP-потоками .