国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

幫助中心 >  技術(shù)知識(shí)庫(kù) >  數(shù)據(jù)庫(kù) >  相關(guān)技術(shù)支持 >  解決$GLOBALS["HTTP_RAW_POST_DATA"]獲取不到數(shù)據(jù)的問(wèn)題

解決$GLOBALS["HTTP_RAW_POST_DATA"]獲取不到數(shù)據(jù)的問(wèn)題

2018-01-06 17:23:51 12506

微信中公眾號(hào)開(kāi)發(fā)中使用$GLOBALS["HTTP_RAW_POST_DATA"]來(lái)獲取微信公眾平臺(tái)推送過(guò)來(lái)的post數(shù)據(jù),結(jié)果驚奇的發(fā)現(xiàn)微信號(hào)總是提示“該微信公眾號(hào)暫時(shí)無(wú)法提供服務(wù)”,仔細(xì)去檢查代碼,也沒(méi)錯(cuò),可就是無(wú)法提供服務(wù)。今天又檢查了一把,還是沒(méi)有語(yǔ)法錯(cuò)誤,于是乎,我將中間的所有數(shù)據(jù)全部寫(xiě)到的記事本里去,通過(guò)及時(shí)本發(fā)現(xiàn)$GLOBALS["HTTP_RAW_POST_DATA"]獲取的數(shù)據(jù)是空的。經(jīng)過(guò)資料查找,終于發(fā)現(xiàn)了解決的套路:

  $GLOBALS ["HTTP_RAW_POST_DATA"]跟$_POST,file_get_contents('php://input')  差不多,用$GLOBALS ["HTTP_RAW_POST_DATA"]或file_get_contents('php://input')的情況大多是為了獲取$_POST無(wú)法接收的數(shù)據(jù)類型(如XML數(shù)據(jù))

  在$GLOBALS ["HTTP_RAW_POST_DATA"]取不到值的情況下可以按以下方式排查:
     1.用file_get_contents('php://input')獲取數(shù)據(jù)。如果獲取不到,則可能是數(shù)據(jù)傳輸錯(cuò)誤,對(duì)請(qǐng)求進(jìn)行捉包,分析數(shù)據(jù)。
     2.如果file_get_contents('php://input')有數(shù)據(jù)。則查看php.ini配置文件。
  找到如下,如果沒(méi)開(kāi)啟則開(kāi)啟
[php] view plain copyalways_populate_raw_post_data = On  
  注意:這種處理方式是在php版本較低的時(shí)候,在php-ini中才有的配置,當(dāng)版本升級(jí)到7,或者更高的時(shí)候該機(jī)制就被廢棄掉了。
下邊歸納幾種php獲取post數(shù)據(jù)的方式:
  RPC 規(guī)定接收取值方式 $GLOBALS['HTTP_RAW_POST_DATA'];
  PHP默認(rèn)識(shí)別的數(shù)據(jù)類型是application/x-www.tjdsmy.cn標(biāo)準(zhǔn)的數(shù)據(jù)類型。

   1、$_POST['paramName'] 
只能接收Content-Type: application/x-www-form-urlencoded提交的數(shù)據(jù),php會(huì)將http請(qǐng)求body相應(yīng)數(shù)據(jù)會(huì) 填入到數(shù)組$_POST,填入到$_POST數(shù)組中的數(shù)據(jù)是進(jìn)行urldecode()解析的結(jié)果。(其實(shí),除了該Content-Type,還有 multipart/form-data表示數(shù)據(jù)是表單數(shù)據(jù))
   2、file_get_contents("php://input") 
適用大多數(shù)類型的Content-type,php://input 允許讀取 POST 的原始數(shù)據(jù)。和 $HTTP_RAW_POST_DATA 比起來(lái),它給內(nèi)存帶來(lái)的壓力較小,并且不需要任何特殊的 php.ini 設(shè)置。php://input 不能用于 enctype="multipart/form-data"。
   3、$GLOBALS['HTTP_RAW_POST_DATA']; 
總是產(chǎn)生 $HTTP_RAW_POST_DATA  變量包含有原始的 POST 數(shù)據(jù)。此變量?jī)H在碰到未識(shí)別 MIME 類型的數(shù)據(jù)時(shí)產(chǎn)生。$HTTP_RAW_POST_DATA  對(duì)于 enctype="multipart/form-data"  表單數(shù)據(jù)不可用。
   如果post過(guò)來(lái)的數(shù)據(jù)不是PHP能夠識(shí)別的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']來(lái)接收,比如 text/xml 或者 soap 等等。需要設(shè)置php.ini中的always_populate_raw_post_data值為On,PHP才會(huì)總把POST數(shù)據(jù)填入變量$http_raw_post_data。

   1,Coentent-Type僅在取值為application/x-www-data-urlencoded和multipart/form- data兩種情況下,PHP才會(huì)將http請(qǐng)求數(shù)據(jù)包中相應(yīng)的數(shù)據(jù)填入全局變量$_POST
   2,PHP不能識(shí)別的Content-Type類型的時(shí)候,會(huì)將http請(qǐng)求包中相應(yīng)的數(shù)據(jù)填入變量$HTTP_RAW_POST_DATA
   3, 只有Coentent-Type不為multipart/form-data的時(shí)候,PHP不會(huì)將http請(qǐng)求數(shù)據(jù)包中的相應(yīng)數(shù)據(jù)填入php: //input,否則其它情況都會(huì)。填入的長(zhǎng)度,由Coentent-Length指定。
   4,只有Content-Type為application/x-www-data-urlencoded時(shí),php://input數(shù)據(jù)才 跟$_POST數(shù)據(jù)相一致。
   5,php://input數(shù)據(jù)總是跟$HTTP_RAW_POST_DATA相同,但是php://input 比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設(shè)置php.ini
   6,PHP會(huì)將PATH字段的query_path部分,填入全局變量$_GET。通常情況下,GET方法提交的http請(qǐng)求,body為空。
  總之:
1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
2、如果不能獲取的時(shí)候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');



提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題: