每天进步一点点:PHP POST以及设置Header的一点探索

in cn •  5 years ago 

最近写个PHP脚本,POST一些数据给指定脚本,并且需要设置Header。

但是设置的Header不生效,为了搞明白到底哪里出了问题,做了一点学习,记录如下,备忘并供遇到同样问题的朋友参考。


(图源 :pixabay)

回显Header

为了测试我设置成Header是否成功发送,我需要一个脚本来回显Header设置,经过学习,我发现PHP自带一个函数getallheaders(),使用这个函数可以轻易获取Header信息。

简单的示例脚本如下:

<?php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value
";
}
?>

让我们来测试一下,浏览器直接访问上述脚本,返回如下内容:

可见上述代码工作良好,可以作为我们的测试辅助工具。

另外需要说明的是getallheaders()其实是apache_request_headers()的别名,两者是一样的。

发送Header

我使用PHP的curl 函数来完成POST。

<?php
    $ch = curl_init(); 
    
    $url = "http://serviceuptime.net/header_echo.php";
    $headers = "Accept-Encoding: gzip, deflate";
    $data = "Hello!";
    
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

    $resp= curl_exec($ch); 
    print_r($resp);
?>

代码如上所示,但是执行上述代码后,返回代码中并没有含有我们设置的内容:

那么哪里出错了呢?通过查看curl_setopt(),我发现传递给CURLOPT_HTTPHEADER选项的,应该是一个数组:

所以上述代码中,正确的写法应为:

$headers = array("Accept-Encoding: gzip, deflate");

再进行测试后,果然返回了我要的结果,证明Header设置成功了。

另外,既然是array,就可以设置多条Header了,这恰恰说明我们之前直接传入字符串的方法是错误的。

示例代码仅供参考

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

补充一下:

[06-Sep-2019 09:56:50 UTC] PHP Warning: curl_setopt(): You must pass either an object or an array with the CURLOPT_HTTPHEADER argument in /home/xxxxxx/public_html/xxx.php on line 11

站点的error_log已经给出了警告⚠
可惜因为是警告,不是出错,所以我没去查看😳

看来没事看看有没有error_log产生,是一个好习惯

Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.01% upvote! Together, let’s change the world!