如何使用PHP CURL在POST请求上设置自定义标头?

时间:2016-02-18 13:12:13

标签: php curl

我有一个奇怪的卷曲问题。示例代码如下。当我运行它时,服务器不会在CUSTOM_HEADER数组中收到$_SERVER标头。如果我删除CURLOPT_POSTFIELDS选项,则会显示标题。

看起来设置CURLOPT_POSTFIELDS会覆盖CURLOPT_HTTPHEADER中添加的标题(但我无法在任何地方找到此文档)。那是对的吗?

改变订单似乎并不重要。我也无法通过设置其他选项来修复它。

<?php
$url = 'http://whatever.url';
$text = 'The quick brown fox jumps over the lazy dog.';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('CUSTOM_HEADER: TEST HEADER VALUE'));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('text' => $text)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);

我发布的脚本只返回$_SERVER信息:

<?php
echo json_encode($_SERVER);
die();

$response数组中,我收到了大量请求标头,但没有CUSTOM_HEADER

是否有其他方法可以将POST数据发送到请求中带有自定义标头的网址?

1 个答案:

答案 0 :(得分:1)

curl端工作正常,但要获取请求标头,您应该使用getallheaders()

如果您发布到此脚本:

<?php echo json_encode( [
    'headers' => getallheaders(),
    'post'    => $_POST
] );

并打印$response,如下所示:

echo "<pre>" . print_r( json_decode( $response ), 1 ) . "</pre>";

它应该显示

stdClass Object
(
    [headers] => stdClass Object
        (
            [Host] => whatever.url
            [Accept] => */*
            [CUSTOM_HEADER] => TEST HEADER VALUE
            [Content-Length] => 49
            [Content-Type] => application/x-www-form-urlencoded
        )

    [post] => stdClass Object
        (
            [text] => The quick brown fox jumps over the lazy dog.
        )

)