2013-10-31 100 views
0

我完全不理解數據傳輸到服務器。我有哪些方法?當我開始學習PHP時,我認爲有兩種方法稱爲GET,它加密URL中的數據,並以另一種方式將數據發送到服務器,即POST。不過,我不知道究竟在哪裏。瞭解XMLHttpRequest如何將數據發送到服務器

現在我想了解REST風格的服務器後端,我得知GETPOST只是請求方法,其中包括像PUTDELETE,這似乎並沒有有什麼用數據是如何轉移到服務器。

此外,我讀了額外的數據可以在HTTP頭中發送。這是如何POST實際發送其數據或有甚至有所不同?

我想讀取POST數據,無論使用PHP的$_POST數組的請求方法,但這不起作用。另一方面,當我嘗試手動解析來自php://input的頭信息時,我看不到POST數據。有人可以向我解釋在不同情況下數據傳輸的位置嗎?

我的目標是從客戶端獲取參數,而不管內容類型,它可能是form-data,json或其他東西,以及請求方法。我怎樣才能在PHP中做到這一點?請求將使用JQuery的AJAX功能發送。

回答

1

爲了解釋如何做使用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。

+0

非常感謝您的回答。讀完之後我還有一些問題。所以只有'GET'是特殊的,所有其他請求方法都將它們的數據編碼到請求內容中?如何讀取請求內容以解碼數據(根據指定的內容類型)?你談論一個帖子正文,每個請求類型是否只有一個HTTP正文或一個正文? – danijar

+0

@danijar標題中的Content-Type。 HTTP正文是HTTP頭後的其餘數據,POST和PUT有正文,但它們是相同的。在PHP中,它們都是流(php://輸入) – farmer1992

+0

好了,現在更清晰了。我可以提供一個自定義的HTTP主體,而不管請求方法如何,例如用'GET'請求發送JSON編碼的信息?我想知道這是否有限制。 – danijar

相關問題