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

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@oflyhigh·
0.000 HBD
每天进步一点点:PHP POST以及设置Header的一点探索
最近写个PHP脚本,POST一些数据给指定脚本,并且需要设置Header。

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

![](https://steemitimages.com/DQmRkLq6rRew3mHfx4vYGWyqpC8wSebLPeC2iZCXAdpuGkR/image.png)
(图源 :[pixabay](https://pixabay.com/))

# 回显Header

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

简单的示例脚本如下:
```
<?php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value
";
}
?>
```

让我们来测试一下,浏览器直接访问上述脚本,返回如下内容:
>![](https://cdn.steemitimages.com/DQmZzua2L11t52CukbZFBdpxUuFhWKqz1rhgva15es6LvNB/image.png)

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

另外需要说明的是[getallheaders()](https://www.php.net/manual/en/function.getallheaders.php)其实是[apache_request_headers()](https://www.php.net/manual/en/function.apache-request-headers.php)的别名,两者是一样的。

# 发送Header

我使用PHP的[curl 函数](https://www.php.net/manual/en/ref.curl.php)来完成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);
?>
```

代码如上所示,但是执行上述代码后,返回代码中并没有含有我们设置的内容:
![](https://cdn.steemitimages.com/DQmT9qq3YuxvC76RfSpoDUfsYmKwrG2K3bLjE1eKWgMrspj/image.png)

那么哪里出错了呢?通过查看[curl_setopt()](https://www.php.net/manual/en/function.curl-setopt.php),我发现传递给`CURLOPT_HTTPHEADER`选项的,应该是一个数组:

>![](https://cdn.steemitimages.com/DQmQ7nWRzVAtRGHnkHeaitprGpEuTxpSBV96Hk1jBCx8STw/image.png)

所以上述代码中,正确的写法应为:
>`$headers = array("Accept-Encoding: gzip, deflate");`

再进行测试后,果然返回了我要的结果,证明Header设置成功了。
>![](https://cdn.steemitimages.com/DQmQBGHkfaLjigmvTi46VmPETiqYx2zpKBGJN2PomYsFcTZ/image.png)

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

***示例代码仅供参考***

# 相关链接

* [getallheaders()](https://www.php.net/manual/en/function.getallheaders.php)
* [apache_request_headers()](https://www.php.net/manual/en/function.apache-request-headers.php)
* [cURL Functions](https://www.php.net/manual/en/ref.curl.php)
* [curl_setopt()](https://www.php.net/manual/en/function.curl-setopt.php)

----
<center><strong>Vote For Me As Witness</strong>
https://steemit.com/~witnesses type in **`oflyhigh`** and click ***`VOTE`***
[![](https://cdn.steemitimages.com/DQmX5NysqT44FBa3bhuWqQ69nAbseu8Nt5YQPn2pYejPVxA/image.png)](https://steemit.com/~witnesses)
[Vote @oflyhigh via Steemconnect](https://steemconnect.com/sign/account-witness-vote?witness=oflyhigh&approve=1)
<strong>Thank you!</strong></center>
👍 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,