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

in #cn5 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!

Sort:  

补充一下:

[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!

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 63001.43
ETH 3365.59
USDT 1.00
SBD 2.45