我正在解决POST到远程站点的一些问题,特别是远程主机永远不会返回任何数据(空字符串).
在我尝试排除其他任何问题之前,我想确保调用代码实际上是正确的.代码是:
$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));
Run Code Online (Sandbox Code Playgroud)
我的所有问题都属于"标题"选项及其值,以及如何正确格式化并编写它.PHP文档,它下面的讨论,甚至stackoverflow研究产生非常不一致的结果.
1)我是否必须包含Content-Length标头,如果没有,PHP会正确计算吗?文档不包含它,但我看到很多人手动包含它,然后被PHP尊重或覆盖?
2)我是否必须将标题选项作为字符串或关联数组传递?手动说字符串,大多数将它作为字符串传递,但是这条评论说如果PHP是用--with-curlwrappers选项编译的,你必须将它作为数组传递.这是非常不一致的行为.
3)当作为字符串传递时,我是否必须包含终止\r\n字符?特别是当只指定一个标题时.手册没有提供这样的例子,手册页上的第一条评论确实包括它,第二条评论没有,再次没有明确规定如何指定.PHP会自动处理这两种情况吗?
服务器使用的是PHP 5.3.
您应该将您的标头作为数组存储在代码中,并在发送请求之前完成准备工作......
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));
Run Code Online (Sandbox Code Playgroud)
小智 2
准备上下文尝试添加:
所以它应该看起来像:
$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
)));
Run Code Online (Sandbox Code Playgroud)