爲了解釋如何做使用nc
http://linux.die.net/man/1/nc
HTTP下班
$ nc -l 8888
啓動虛擬服務器聽在8888
使用jQuery(通過XHR IMPL)發送GET請求
$.get("http://localhost:8888", { a :1 ,b: 2})
nc w烏爾德打印什麼XHR向服務器發送到stdout
$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
POST
使用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
WHY php://input
不能看到POST BODY
根據http://php.net/manual/en/wrappers.php.php
php://input
是一個流,可以只讀一次
以下是來自php文檔
注意:使用php://輸入打開的流只能讀取一次; 流不支持查找操作。但是,根據SAPI實現 ,可能會打開另一個php://輸入 流並重新開始讀取。這僅在請求主體 數據已被保存時纔有可能。通常,POST請求的情況是 ,但不包括其他請求方法,例如PUT或PROPFIND。
非常感謝您的回答。讀完之後我還有一些問題。所以只有'GET'是特殊的,所有其他請求方法都將它們的數據編碼到請求內容中?如何讀取請求內容以解碼數據(根據指定的內容類型)?你談論一個帖子正文,每個請求類型是否只有一個HTTP正文或一個正文? – danijar
@danijar標題中的Content-Type。 HTTP正文是HTTP頭後的其餘數據,POST和PUT有正文,但它們是相同的。在PHP中,它們都是流(php://輸入) – farmer1992
好了,現在更清晰了。我可以提供一個自定義的HTTP主體,而不管請求方法如何,例如用'GET'請求發送JSON編碼的信息?我想知道這是否有限制。 – danijar