【发布时间】:2016-08-14 16:15:16
【问题描述】:
我正在使用file_get_contents() 对 API 服务执行 POST。这适用于大多数查询。但是,最近我遇到了一个失败,file_get_contents() 在内容中返回了 HTTP 标头!
代码:
$resp = file_get_contents("http://10.72.18.21:8000",false, $context);
var_dump($resp);
var_dump($http_response_header);
我每次都会得到以下内容和标题:
string(114328) "Server: Spark Proxy Server
Content-Length: 114272
{"records":....}
"
array(1) {
[0]=>
string(31) "HTTP/1.0 200 Spark Proxy Server"
}
请注意,在$resp 中,您可以看到通常应在$http_response_header 中解析的标题(前两行)。
我还尝试了两种不同的 POST 方法:(a) fopen + while 循环和 (b) fopen + stream_get_contents。在所有三种情况下,结果都是相同的。这三者之间的共同点是我使用创建的流上下文:
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded;charset=utf-8',
'content' => http_build_query($params)
)
);
$context = stream_context_create($opts);
现在,使用相同的代码查询相同的 API,但修改了一个参数,一切都按预期工作,完整的标头是:
array(3) {
[0]=>
string(31) "HTTP/1.0 200 Spark Proxy Server"
[1]=>
string(26) "Server: Spark Proxy Server"
[2]=>
string(19) "Content-Length: 288"
}
最后,我尝试了使用 python 和 cUrl 失败的相同调用,并且在这两种情况下结果都是正确的,所以我很确定这是与 php 相关的问题。
问题:
- 以前有人见过这种行为吗?
- 有没有办法在不使用
stream_context_create的情况下执行相同的 POST? - 可能与时间有关吗?失败的示例最多需要 1.4 分钟才能完成
【问题讨论】:
-
10.72.18.21是一个私有网络地址,请与您的技术支持人员确认他们最近没有在其中的某处添加代理服务器,或者更改了一直存在的代理服务器的配置跨度> -
@RiggsFolly 嗨,实际上,IP 是一个(自定义)代理服务器 :) 过滤我的查询,然后使用真正的 API(我无法访问),重新组织结果并将它们发回。但是,我已经使用 curl 和浏览器进行了测试,并且可以正常工作......所以我认为不是网络问题
标签: php http-headers http-post file-get-contents