PHP流\u上下文\u创建和HTTP头-数组或字符串,\r\n结尾,内容长度可选?
我正在排除一些发布到远程站点的问题,特别是远程主机从不返回任何数据(空字符串) 在尝试排除任何其他故障之前,我希望确保调用代码实际上是正确的。代码是:PHP流\u上下文\u创建和HTTP头-数组或字符串,\r\n结尾,内容长度可选?,php,http,header,Php,Http,Header,我正在排除一些发布到远程站点的问题,特别是远程主机从不返回任何数据(空字符串) 在尝试排除任何其他故障之前,我希望确保调用代码实际上是正确的。代码是: $context = stream_context_create(array('http' => array( 'method' => "POST", 'header' => "Content-Type: application/xml", 'timeout' =&
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: application/xml",
'timeout' => 60.0,
'ignore_errors' => true, # return body even if HTTP status != 200
'content' => $send_xml
)));
$response = trim(file_get_contents($this->bulk_service_url, false, $context));
我所有的问题都属于“header”选项及其值,以及如何正确格式化和编写。PHP文档、下面的讨论甚至stackoverflow研究都产生了非常不一致的结果
1) 我是否必须包含内容长度标题,如果不是,PHP会正确计算它吗?不包括它,但我见过很多人手动包含它,那么它是受到PHP的尊重还是被PHP覆盖
2) 我必须以字符串或关联数组的形式传递标题选项吗?手册上说字符串,大多数将其作为字符串传递,但说如果PHP是使用--with curlwrappers选项编译的,则必须将其作为数组传递。这是非常不一致的行为
3) 作为字符串传递时,是否必须包含终止的\r\n
字符?特别是当只指定一个标题时。手册并没有提供这样一个例子,手册页面上的第一条注释确实包含了这个例子,第二条注释并没有明确的规则来说明如何指定这个例子。PHP会自动处理这两种情况吗
服务器正在使用PHP 5.3。准备上下文请尝试添加:
$dl = strlen($send_xml);//YOUR_DATA_LENGTH
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: application/xml\r\nContentLength: $dl\r\n",
'timeout' => 60.0,
'ignore_errors' => true, # return body even if HTTP status != 200
'content' => $send_xml
)));
您应该在代码中以数组的形式存储头文件,并在发送请求之前完成准备工作
function prepareHeaders($headers) {
$flattened = array();
foreach ($headers as $key => $header) {
if (is_int($key)) {
$flattened[] = $header;
} else {
$flattened[] = $key.': '.$header;
}
}
return implode("\r\n", $flattened);
}
$headers = array(
'Content-Type' => 'application/xml',
'ContentLength' => $dl,
);
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => prepareHeaders($headers),
'timeout' => 60.0,
'ignore_errors' => true,
'content' => $send_xml
)));
$response = trim(file_get_contents($url, FALSE, $context));
对@doublejosh的建议稍加改进,以防对某人有所帮助:
(使用数组表示法和一行lambda函数)
$headers=[
'内容类型'=>'应用程序/xml',
“内容长度”=>strlen($send\u xml)
];
$context=stream\u context\u create(['http'=>[
'方法'=>“发布”,
'header'=>数组_映射(函数($h,$v){return“$h:$v”;},数组_键($headers),$headers),
“超时”=>60.0,
“忽略错误”=>true,
“内容”=>$send\u xml
]
]);
我认为您应该使用cURL而不是file\u get\u内容