使用http://linux.die.net/man/1/nc来解释 http 是如何工作的nc
得到
$ nc -l 8888
在 8888 启动一个虚拟服务器监听
使用 jQuery 发送 GET 请求(通过 XHR 实现)
$.get("http://localhost:8888", { a :1 ,b: 2})
nc 会将 XHR 发送到服务器的内容打印到标准输出
$nc -l 8888
GET /?a=1&b=2&_=1383234919249 HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Accept: */*
Origin: http://stackoverflow.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
DNT: 1
Referer: http://stackoverflow.com/questions/19710815/understanding-how-xmlhttprequest-sends-data-to-a-server
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
因此,PHP 解析GET /?a=1&b=2&_=1383234919249
成$_GET
邮政
用于nc
记录 POST
POST / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Content-Length: 7
Accept: */*
Origin: http://stackoverflow.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
DNT: 1
Referer: http://stackoverflow.com/questions/19710815/understanding-how-xmlhttprequest-sends-data-to-a-server
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
a=1&b=2
在这里你可以看到Content-Type: application/x-www-form-urlencoded
,它告诉浏览器发送的 http 正文是表单编码的
结果,PHP 解析a=1&b=2
为数组$_POST
为什么php://input
看不到 POST BODY
根据http://php.net/manual/en/wrappers.php.php
php://input
是一个流,只能读取一次
以下来自php doc
注意:使用 php://input 打开的流只能读取一次;该流不支持查找操作。但是,根据 SAPI 实现,可能会打开另一个 php://input 流并重新开始读取。这只有在请求正文数据已保存时才有可能。通常,这是 POST 请求的情况,但不是其他请求方法,例如 PUT 或 PROPFIND。