PHP - HTTP Post - неверные заголовки - PullRequest
1 голос
/ 08 июня 2009

Привет! В настоящее время я пытаюсь опубликовать XML-файл на внешнем сервере, но я получаю ответ, что заголовки неверны. Размещаемому серверу требуется несколько заголовков, и мне интересно, имеют ли они правильный формат или есть какие-либо другие «стандартные» заголовки, которые необходимо включить?

Мой код:

<?php

function httpsPost($Url, $xml_data, $headers)
{
   // Initialisation
   $ch=curl_init();
   // Set parameters
   curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
   curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    
   curl_setopt($ch, CURLOPT_URL, $Url);
   // Return a variable instead of posting it directly
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch,CURLOPT_USERPWD,"username:password");
   // Active the POST method
   curl_setopt($ch, CURLOPT_POST, 1) ;
   // Request
   curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
   // execute the connexion
   $result = curl_exec($ch);
   // Close it
   curl_close($ch);
   return $result;
}

$headers[0]="BATCH_TYPE: XML_SINGLE"; 
$headers[1]="BATCH_COUNT: 1"; 
$headers[2]="VENDOR_ID: 53906";

$request_file = "./post_this.xml"; 
$fh = fopen($request_file, 'r'); 
$xml_data = fread($fh, filesize($request_file)); 
fclose($fh);    

$url = 'http://www.example.com/test.php';

$Response = httpsPost($url, $xml_data, $headers);

echo $Response;

?>

Ответы [ 3 ]

0 голосов
/ 10 июня 2009

Я провел множество исследований по этому вопросу, но у меня нет однозначного ответа. Я выйду на конечности и скажу, что, по-моему, проблема в том, что ваши заголовки используют подчеркивания вместо черточек. Я не могу вспомнить ни одного стандартного заголовка HTTP, который использует подчеркивание.

Это совершенно законно в соответствии со спецификацией HTTP 1.1 . Согласно RFC 2616:

message-header = field-name ":" [ field-value ]
field-name     = token
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

Если это вариант, я предлагаю изменить сервер на ожидаемый Batch-Type, Batch-Count и Vendor-Id.

Если Curl меняет имена заголовков за вашей спиной, вы должны сообщить об этом как об ошибке .

0 голосов
/ 10 июня 2009

Если я использую локальный сценарий в качестве сценария для публикации, вывод будет правильным.

Локальный скрипт просто состоит из

<?php
  phpinfo();
?>

Итак, я полагаю, что проблема не в вашем коде, а в отображении на http://www.xhaus.com/headers.. Этот сайт, кажется, заменяет подчеркивания черточками для отображения. Зачем использовать этот URL для отображения результатов, а не свой собственный phpinfo-скрипт?

0 голосов
/ 08 июня 2009

попробуй

curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); 
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Accept: text/xml")); 

или используйте это

$header[] = "Host: ".$host; 
$header[] = "MIME-Version: 1.0"; 
$header[] = "Accept: text/xml";
$header[] = "Content-length: ".strlen($xmlRequest);
$header[] = "Cache-Control: no-cache";
$header[] = "Connection: close \r\n";
$header[] = $xmlRequest; // Contains the XML request 

ссылка может помочь с примером: http://www.nabble.com/Problems-posting-xml-file-with-curl-and-php-td16129807.html

...