PHP如何獲取Post請求中的Json字符串數據?


摘自:http://dianjingjiaoyu.blog.163.com/blog/static/18347920820114194642257/

最近用到ext與PHP交互,ext把json數據post給PHP,但在PHP里面$_POST獲取不到,$_REQUEST也獲取不到,但是通過firedebug看到的請求信息確實是把JSON數據post給了PHP,這什么情況...突然想到了以前接觸過flash將圖片二進制流傳給php,靈機一動用 $GLOBALS['HTTP_RAW_POST_DATA'] 獲取到了。於是就深入的查了一下,原來PHP默認只識別application/x-www.form-urlencoded標准的數據類型,因此,對型如 text/xml 或者 soap 或者 application/octet-stream 之類的內容無法解析,如果用$_POST數組來接收就會失敗!故保留原型,交給 $GLOBALS['HTTP_RAW_POST_DATA'] 來接收。

 


 

摘自:http://7297576.blog.163.com/blog/static/72686442201022981219526/

用Content-Type=text/xml 類型,提交一個xml文檔內容給了php server,要怎么獲得這個POST數據。

The RAW / uninterpreted HTTP POST information can be accessed with:   $GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).

由於PHP默認只識別application/x-www.form-urlencoded標准的數據類型,因此,對型如text/xml的內容無法解析為$_POST數組,故保留原型,交給$GLOBALS['HTTP_RAW_POST_DATA'] 來接收。

另外還有一項 php://input 也可以實現此這個功能

php://input 允許讀取 POST 的原始數據。和 $GLOBALS['HTTP_RAW_POST_DATA'] 比起來,它給內存帶來的壓力較小,並且不需要任何特殊的 php.ini 設置。php://input 不能用於 enctype="multipart/form-data"。

應用

a.htm   
  ------------------   
  <form   action="post.php"   method="post">   
      <input   type="text"   name="user">   
      <input   type="password"   name="password">   
      <input   type="submit">   
  </form>      
    
  post.php   
  ----------------------------   
  <?   echo   file_get_contents("php://input");   ?>  

 


 

摘自:http://hi.baidu.com/lq3158/item/74ac0bbffdad5fa4eaba93e1

在通過ajax向php程序中傳遞數據時,會發現使用$_POST根本無法獲取數據,但是在firebug中可以看到post中其實是有json數據的。

在使用 print_r(file_get_contents("php://input")) 之后,卻可以得到json數據。

 

那什么是php://input呢?

對php://input的介紹,PHP官方手冊文檔有一段話對它進行了很明確地概述。 

“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”. 

翻譯過來,是這樣: 

“php://input可以讀取沒有處理過的POST數據。相較於$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,並且不需要特殊的php.ini設置。php://input不能用於enctype=multipart/form-data”。

1、Content-Type取值為application/x-www-form-urlencoded時,php會將http請求body相應數據會填入到數組$_POST,填入到$_POST數組中的數據是進行urldecode()解析的結果。(其實,除了該Content-Type,還有multipart/form-data表示數據是表單數據,稍后我們介紹) 

2、php://input數據,只要Content-Type不為multipart/form-data(該條件限制稍后會介紹)。那么php://input數據與http entity body部分數據是一致的。該部分相一致的數據的長度由Content-Length指定。 

3、僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST數據與php://input數據才是”一致”(打上引號,表示它們格式不一致,內容一致)的。其它情況,它們都不一致。 

4、php://input讀取不到$_GET數據。是因為$_GET數據作為query_path寫在http請求頭部(header)的PATH字段,而不是寫在http請求的body部分。 

相信大家對php://input已經有一定深度地了解了。那么$http_raw_post_data是什么呢?$http_raw_post_data是PHP內置的一個全局變量。它用於,PHP在無法識別的Content-Type的情況下,將POST過來的數據原樣地填入變量$http_raw_post_data。它同樣無法讀取Content-Type為multipart/form-data的POST數據。需要設置php.ini中的always_populate_raw_post_data值為On,PHP才會總把POST數據填入變量$http_raw_post_data。 

 

學習筆記

1、Coentent-Type僅在取值為application/x-www-data-urlencodedmultipart/form-data兩種情況下,PHP才會將http請求數據包中相應的數據填入全局變量$_POST 

2、PHP不能識別的Content-Type類型的時候,會將http請求包中相應的數據填入變量$HTTP_RAW_POST_DATA 

3、只有Coentent-Type不為multipart/form-data的時候,PHP不會將http請求數據包中的相應數據填入php://input,否則其它情況都會。填入的長度,由Coentent-Length指定。 

4、只有Content-Type為application/x-www-data-urlencoded時,php://input數據才跟$_POST數據相一致。 

5、php://input數據總是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設置php.ini 

6、PHP會將PATH字段的query_path部分,填入全局變量$_GET。通常情況下,GET方法提交的http請求,body為空。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM