**對比$_POST、$GLOBALS['HTTP_RAW_POST_DATA']和file_get_contents('php://input')

suboysugar發表於2016-04-13

最近在開發微信介面,又學到了一些新的技術點,今天就把學到的關於接收資料的技術點給簡單的羅列下。

 

 

[php] view plain copy
 

 print?

  1. public function __construct($token, $wxuser = “){  
  2.         $this -> auth($token, $wxuser) || exit;  
  3.         if(IS_GET){  
  4.             echo($_GET[`echostr`]);  
  5.             exit;  
  6.         }else{  
  7.             $xml = file_get_contents(“php://input”);  
  8.             $xml = new SimpleXMLElement($xml);  
  9.             $xml || exit;  
  10.             foreach ($xml as $key => $value){  
  11.                 $this -> data[$key] = strval($value);  
  12.             }  
  13.         }  
  14.     }  

 

 

上述程式碼是擷取的一個片段,意思為把接收到的微信傳過來的xml解析為陣列。其中有一處file_get_contents(`php://input`),後經查證,微信給開發者賬號填寫的url傳送的是xml資料,但PHP預設只識別application/x-www.form-urlencoded標準的資料型別,對text/xml的內容無法解析為$_POST陣列,因此會保留原型,可以交給file_get_contents(‘php://input’)接收,也可以用$GLOBALS[`HTTP_RAW_POST_DATA`]。

 

如,傳過來的xml為

 

[php] view plain copy
 

 print?

  1. <xml>  
  2. <ToUserName><![CDATA[ebyben1413005325]]></ToUserName>  
  3. <FromUserName><![CDATA[ga_6281708af4c6]]></FromUserName>  
  4. <CreateTime>1413341614</CreateTime>  
  5. <MsgType><![CDATA[text]]></MsgType>  
  6. <Content><![CDATA[首頁]]></Content>  
  7. <MsgId>1234567890123456</MsgId>  


解析過後為

 

 

[php] view plain copy
 

 print?

  1. Array  
  2. (  
  3.     [ToUserName] => ebyben1413005325  
  4.     [FromUserName] => ga_6281708af4c6  
  5.     [CreateTime] => 1413341614  
  6.     [MsgType] => text  
  7.     [Content] => 首頁  
  8.     [MsgId] => 1234567890123456  
  9. )  

 

php://input 允許讀取 POST 的原始資料。和$GLOBALS[`HTTP_RAW_POST_DATA`] 比起來,它給記憶體帶來的壓力較小,並且不需要任何特殊的 php.ini 設定。同時兩者皆不能用於接收enctype=”multipart/form-data”形式的資料。

 

 

最後再說下$_SERVER[`REQUEST_METHOD`]這個變數,用過ThinkPHP的朋友應該在程式碼中使用類似IS_GET、IS_AJAX這種程式碼吧,追溯下原始碼,就可以看到

 

[php] view plain copy
 

 print?

  1. define(`REQUEST_METHOD`,$_SERVER[`REQUEST_METHOD`]);  
  2. define(`IS_GET`,        REQUEST_METHOD ==`GET` ? true : false);  
  3. define(`IS_POST`,       REQUEST_METHOD ==`POST` ? true : false);  
  4. define(`IS_PUT`,        REQUEST_METHOD ==`PUT` ? true : false);  
  5. define(`IS_DELETE`,     REQUEST_METHOD ==`DELETE` ? true : false);  
  6. define(`IS_AJAX`,       ((isset($_SERVER[`HTTP_X_REQUESTED_WITH`]) && strtolower($_SERVER[`HTTP_X_REQUESTED_WITH`]) == `xmlhttprequest`) || !empty($_POST[C(`VAR_AJAX_SUBMIT`)]) || !empty($_GET[C(`VAR_AJAX_SUBMIT`)])) ? true : false);  


原來僅僅就用了這個變數,就達到效果。

如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/


相關文章