PHP-httppost-不正确的头

PHP-httppost-不正确的头,php,httpwebrequest,http-headers,Php,Httpwebrequest,Http Headers,您好,我目前正试图将一个xml文件发布到外部服务器,但我得到的响应是,标题不正确。我发布的服务器需要一些标题,我想知道它们的格式是否正确,或者是否需要包含任何其他“标准”标题 我的代码是: <?php function httpsPost($Url, $xml_data, $headers) { // Initialisation $ch=curl_init(); // Set parameters curl_setopt($ch, CURLOPT_FORBID_

您好,我目前正试图将一个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;

?>

试试看

还是用那个

$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头

这是完全合法的。根据RFC 2616:

message-header = field-name ":" [ field-value ]
field-name     = token
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT
消息头=字段名“:“[字段值]
字段名=令牌

token=1*

如果我使用本地脚本作为要发布到的脚本,则输出是正确的

本地脚本只包括

<?php
  phpinfo();
?>


所以,我想问题不在于你的代码,而在于屏幕上的显示。该网站似乎将下划线替换为破折号以供显示。为什么要使用该url来显示结果,而不是您自己的phpinfo脚本?

您是说将请求放入:$header[]=$xml\u data;而不是:curl_setopt($ch,CURLOPT_POSTFIELDS,$xml_data);您好,外部服务器所需的标题是什么?:$headers[0]=“BATCH\u TYPE:XML\u SINGLE”$标题[1]=“批次计数:1”$标题[2]=“供应商ID:53906”;谢谢,对不起,我希望您找到了解决方案。我被告知,问题可能是接收到的标题与发送的标题不同,例如:供应商ID作为供应商ID接收\n批处理类型作为批处理类型接收..\n有人知道如何排序吗?如果您发布有关服务器的详细信息和确切错误,可能会有所帮助您正在看到的消息。如果您碰巧使用Firebug,可能有助于发布您在此处收到的确切标题响应。问题在于接收的标题与发送的标题不同,例如:供应商ID作为供应商ID接收\n批处理类型作为批处理类型接收..\n有人知道如何排序吗

如果您将上面$url的值更改为yopu,我会明白我的意思……嗨,Steve,我完全同意您的看法-我想我发帖子给的人在某处犯了错误。从上面的代码看,它看起来是正确的,不是吗?没有明显的错误,为什么这篇文章可能不起作用,是吗?我只是拼凑了一个快速测试脚本。PHP的curl函数不会更改标题。它们是按原样发送的,但是,很有可能服务器端环境正在用-替换并“修复”案例。在PHP中,如果您试图在$\u服务器中获取头文件,它们将使用HTTP_u前缀进行大小写,并将-转换为u。原来的格式丢失了。是的,是的,不需要;在标题中不要紧,这在他们的规范中…而且uu也发生了变化。。。。我只想承认我的头球没有问题…应该是别的什么东西或是在他们的末端。谢谢你的帮助。
<?php
  phpinfo();
?>