2010-04-28 31 views
93

file_get_contents(「php:// input」)或$ HTTP_RAW_POST_DATA,哪一個更適合獲取JSON請求的主體?

當我使用客戶端XmlHTTPRequest時應該使用哪種請求類型(GETPOST)來發送JSON數據?

我的問題,從這個答案的啓發: How to post JSON to PHP with curl

他說:

從協議的角度看file_get_contents("php://input")其實更正確的是,因爲你沒有真正處理HTTP多形式的數據呢。

+1

你有沒有得到你需要的迴應? ;-) – maraspin 2011-11-22 23:44:44

+3

@maraspin - 我猜不是,因爲他沒有接受答案;-) – Ben 2012-05-09 05:45:07

回答

164

其實php://input允許你讀取原始的POST數據。

這是一個較少的內存密集型替代$ HTTP_RAW_POST_DATA,並不需要任何特殊的php.ini指令

php://input不適用於enctype="multipart/form-data"

參考:http://php.net/manual/en/wrappers.php.php

+9

從來沒有聽說過這種方法來檢索數據,很好的答案! – Jordy 2014-01-06 11:22:20

+10

另外,從PHP 5.6開始,'$ HTTP_RAW_POST_DATA'被認爲不推薦使用,'php:// input'可以被重用。 – 2014-08-28 16:19:46

+0

另請參閱['enable_post_data_reading'](http://stackoverflow.com/a/12777947/632951)。 – Pacerier 2015-02-05 12:12:28

2

第二個問題很簡單,GET在服務器和瀏覽器端都有1-2千字節的大小限制,所以任何類型的大量數據都必須通過POST發送。

3

通常的規則應該適用於您發送請求的方式。如果請求是檢索信息(例如,部分搜索'提示'結果,或要顯示的新頁面等),則可以使用GET。如果正在發送的數據是更改內容的請求(更新數據庫,刪除記錄等)的一部分,則使用POST。

服務器端,沒有理由使用原始輸入,除非你想一次抓取整個post/get數據塊。像往常一樣,您可以通過_GET/_POST數組檢索您想要的特定信息。諸如MooTools/jQuery之類的AJAX庫將處理實際的AJAX調用和將表單數據編碼爲適合您的格式的難題。

+0

這就是關鍵:我想抓住整個帖子/獲取數據塊,因爲JSON是一個變量格式,它只提供數據。 – 2010-04-28 16:32:22

+0

@Kucebe我不明白爲什麼這是必要的,爲什麼不把JSON數據放入POST字段並完成它呢? – 2010-04-28 16:36:47

+0

如果你想要整個JSON塊,那麼爲什麼不把JSON文本塊分配給一個表單域並且像這樣提交呢? ''是完全可以接受的,並且可以讓您用$ _REQUEST ['data']對服務器端進行簡單的檢索。 – 2010-04-28 18:59:10

2

對於JSON數據,將其作爲「application/json」內容類型進行發佈要容易得多。如果你使用GET,你必須在參數中對JSON進行URL編碼,這是一種混亂。另外,當您執行POST時,沒有大小限制。 GET的大小如果非常有限(最多4K)。

+2

POST通常有一個大小限制,但通常設置得相當高。檢查你的'php.ini'。 – Brad 2014-07-23 19:30:03

10

PHP://輸入是只讀流,其可以讀取原始數據 從請求體。在POST請求的情況下,最好 使用php://輸入而不是$ HTTP_RAW_POST_DATA作爲它不是 取決於特殊的php.ini指令。此外,對於缺省情況下未填充$ HTTP_RAW_POST_DATA的情況下的 ,這是 可能更少的內存密集型替代方法,可用於激活 always_populate_raw_post_data。

來源:http://php.net/manual/en/wrappers.php.php

+2

另外,從PHP 5.6開始,'$ HTTP_RAW_POST_DATA'被認爲不推薦使用,'php:// input'可以被重用。 – 2014-08-28 16:20:15

7

的file_get_contents(PHP://輸入) - 獲取原始POST數據,你需要當你寫的API使用這個,需要XML/JSON/...輸入不能由PHP 進行解碼,以$ _ POST一些例子:

郵寄JSON字符串發送

<input type="button" value= "click" onclick="fn()"> 
<script> 
function fn(){ 


    var js_obj = {plugin: 'jquery-json', version: 2.3}; 

    var encoded = JSON.stringify(js_obj); 

var data= encoded 


    $.ajax({ 
    type: "POST", 
    url: '1.php', 
    data: data, 
    success: function(data){ 
    console.log(data); 
    } 

}); 

    } 
</script> 

1.PHP

//print_r($_POST); //empty!!! don't work ... 
var_dump(file_get_contents('php://input')); 
相關問題