考虑这个函数:
function use_fopen($url, $make_post_field, $headers = '') {
$context = array(
'http' => array(
'method' => 'POST',
'timeout' => '60',
'content' => $make_post_field)
);
$header = "Content-type: application/x-www-form-urlencodedrn";
if (!empty($headers)) {
foreach ($headers as $head) {
$header.="$headrn";
}
}
$context['http']['header'] = $header;
$context = stream_context_create($context);
//$contents = @file_get_contents($url, null, $context);
$fp = fopen($url, 'r', false, $context);
$stream_meta_data = @stream_get_meta_data($fp);
print_r($stream_meta_data );
fclose($fp);
}
我使用这样的功能:
$headers = array ('baz: bar');
$data = array ('foo' => 'bar', 'bar' => 'baz');
$data = http_build_query($data);
print(use_fopen("http://www.example.com/phpinfo.php", $data, $headers));
由于目标url是phpinfo,我可以验证$_POST['foo']
是否设置为bar和
CONTENT_TYPE = application/x-www-form-urlencoded
HTTP_FOO = baz
所以上下文似乎运行良好,但当我使用时
$stream_meta_data = @stream_get_meta_data($fp);
print_r($stream_meta_data );
我得到
Array
(
[timed_out] =>
[blocked] => 1
[eof] =>
[wrapper_data] => Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Tue, 02 Aug 2016 11:46:36 GMT
[2] => Server: Apache
[3] => Connection: close
[4] => Content-Type: text/html; charset=UTF-8
)
[wrapper_type] => http
[stream_type] => tcp_socket/ssl
[mode] => r
[unread_bytes] => 8061
[seekable] =>
[uri] => http://wwwexample.com/phpinfo.php
)
为什么内容类型是错误的,而HTTP_FOO实际上是一个标头却没有显示在这里?下面的改动也于事无补。我该怎么办?以获得自定义标题和正确的内容类型?
$contents = @file_get_contents($url, null, $context);
print_r(get_headers($url));
我搜索了SO,发现了这个如何在PHP中POST请求后获得HTTP响应头?但正如我所说,我尝试了stream_get_meta_data($fp)
和get_headers($url)
,但我没有得到我的自定义标头。我还能做什么?
从谷歌找到你的线程,因为我和你有同样的问题。我使用函数stream_context_set_default解决了这个问题。我想我会把它发布给下一个从谷歌跌跌撞撞进来的人,或者如果你还需要一个解决方案的话。