1. 程式人生 > >解決$GLOBALS["HTTP_RAW_POST_DATA"]獲取不到資料的問題

解決$GLOBALS["HTTP_RAW_POST_DATA"]獲取不到資料的問題

昨天在微信中公眾號開發中使用$GLOBALS["HTTP_RAW_POST_DATA"]來獲取微信公眾平臺推送過來的post資料,結果驚奇的發現微訊號總是提示“該微信公眾號暫時無法提供服務”,仔細去檢查程式碼,也沒錯,可就是無法提供服務。今天又檢查了一把,還是沒有語法錯誤,於是乎,我將中間的所有資料全部寫到的記事本里去,通過及時本發現$GLOBALS["HTTP_RAW_POST_DATA"]獲取的資料是空的。經過資料查詢,終於發現瞭解決的套路:
   $GLOBALS ["HTTP_RAW_POST_DATA"]$_POST,file_get_contents('php://input')  差不多,用$GLOBALS ["HTTP_RAW_POST_DATA"]或file_get_contents('php://input')的情況大多是為了獲取$_POST無法接收的資料型別(如XML資料)

   在$GLOBALS ["HTTP_RAW_POST_DATA"]取不到值的情況下可以按以下方式排查:
      1.用file_get_contents('php://input')獲取資料。如果獲取不到,則可能是資料傳輸錯誤,對請求進行捉包,分析資料。
      2.如果file_get_contents('php://input')有資料。則檢視php.ini配置檔案。
   找到如下,如果沒開啟則開啟
  1. always_populate_raw_post_data = On  
   注意這種處理方式是在php版本較低的時候,在php-ini中才有的配置,當版本升級到7,或者更高的時候該機制就被廢棄掉了
下邊歸納幾種php獲取post資料的方式:
   RPC 規定接收取值方式 $GLOBALS['HTTP_RAW_POST_DATA'];
   PHP預設識別的資料型別是application/x-www.form-urlencoded標準的資料型別。

    1、$_POST['paramName'] 
只能接收Content-Type: application/x-www-form-urlencoded提交的資料,php會將http請求body相應資料會 填入到陣列$_POST,填入到$_POST陣列中的資料是進行urldecode()解析的結果。(其實,除了該Content-Type,還有 multipart/form-data表示資料是表單資料)
    2、file_get_contents("php://input") 
適用大多數型別的Content-type,php://input 允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小,並且不需要任何特殊的 php.ini 設定。php://input 不能用於 enctype="multipart/form-data"。
    3、$GLOBALS['HTTP_RAW_POST_DATA']; 
總是產生 $HTTP_RAW_POST_DATA  變數包含有原始的 POST 資料。此變數僅在碰到未識別 MIME 型別的資料時產生。$HTTP_RAW_POST_DATA  對於 enctype="multipart/form-data"  表單資料不可用。
    如果post過來的資料不是PHP能夠識別的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']來接收,比如 text/xml 或者 soap 等等。需要設定php.ini中的always_populate_raw_post_data值為On,PHP才會總把POST資料填入變數$http_raw_post_data。

    1,Coentent-Type僅在取值為application/x-www-data-urlencoded和multipart/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為空。
   總之:
1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
2、如果不能獲取的時候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');

相關推薦

解決$GLOBALS["HTTP_RAW_POST_DATA"]獲取資料的問題

昨天在微信中公眾號開發中使用$GLOBALS["HTTP_RAW_POST_DATA"]來獲取微信公眾平臺推送過來的post資料,結果驚奇的發現微訊號總是提示“該微信公眾號暫時無法提供服務”,仔細去檢查程式碼,也沒錯,可就是無法提供服務。今天又檢查了一把,還是沒有語法錯誤,

微信介面$GLOBALS['HTTP_RAW_POST_DATA']接收到值

$xml = $GLOBALS['HTTP_RAW_POST_DATA'];列印$xml出來,結果是null使用的是php7,原因是php7已移除這個全域性變數,改成$xml = file_get_contents("php://input");即可

微信公共平臺php語言開發時php用$GLOBALS["HTTP_RAW_POST_DATA"]收到資訊

今天在用php語言開發微信公眾號後臺時,發現使用以下語句獲取粉絲髮來的資訊時 simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'],'SimpleXMLElement',LIBXML_NOCDATA) 始終收不到資訊,後

EasyUI Datagrid 獲得選中行(CheckBox)的使用和獲取資料正常(資料缺失。。)的解決

checkOnSelect            當為True的時候,點每一行時CheckBox就會被選中;為False時,只能手動的點選CheckBox ;預設true;      select

jqGrid 能獲取json 資料,前端資料顯示出!(解決)

jqGrid 從後臺能獲取json 資料,但是前臺grid資料顯示不出!(最後朋友幫忙解決的) 一、首先要確認json格式要正確(是否拼接錯誤了) 格式不清楚的可以去百度一下。 二、錯誤處理 jQuery("#_lessonGrid")

spring-boot上傳文件MultiPartFile獲取到文件問題解決

smu number o-c you output oar multi element cep 1.現象是在spring-boot裏加入commons-fileupload jar並且配置了mutilPart的bean,在upload的POST請求後,發現 multipa

hibernate 4.3 在使用獲取數據獲取到數據庫中最新變更的數據問題解決

有效 ron www strong tail 版本 連接池 其它 ems hibernate 4.3 在使用獲取數據獲取不到數據庫中最新變更的數據問題解決,應該是因為緩存問題 問題過程和現象: 查詢一個數據列表=》數據庫中手動update了數據=》刷新頁面,數據顯示還是up

Spring MVC獲取到post提交的multipart/form-data格式的資料

我們在寫介面時,經常會用postman測試介面。前段時間我寫介面時,發現post的form-data提交資料,後端竟然接收不到請求引數,而使用post的x-www-form-urlencoded方式提交資料,後端可以接收到引數。為什麼? postman的form-data是指mult

$_file獲取到檔案資料

在form 表單中上傳檔案後可以在action:之後的檔案中用$_file查詢上傳檔案的資訊 。若上傳檔案的資訊為  :array{    } ; {  } 內部無內容  返回  form表單中檢視  是否新增  屬性&

XAMPP裡的Tomcat修改了埠以後啟動Tomcat獲取到狀態的解決

    XAMPP V3.2.1安裝完畢,並且安裝了JDK7,啟動後,PHP和JSP訪問都能正常。     PHP執行在常規的80埠,JSP執行在預設的8080埠,即Tomcat配置的是8080埠。     改換Tomcat的埠,把

ajax post data 獲取資料,注意 content-type的設定 、post/get(轉)

ajax post  data  獲取不到資料,注意 content-type的設定 、post/get 關於 jQuery data 傳遞資料。網上各種獲取不到資料,亂碼之類的。 好吧今天我也遇到了,網上一查各種糾結。亂碼不管先看獲取不到資料。 因為之前一直用jQuery ajax

利用C++獲取某一資料夾下的所有檔名,並獲取帶字尾的檔名字

來源:https://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 那麼到底如何查詢檔案呢?我們需要一個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在<io.h>的標頭檔案中, 結構體為struct _finddata_t

解決前端頁面獲取到中文資料/無法顯示中文資料的方法

解決前端頁面獲取不到中文資料/無法顯示中文資料的方法 原因:Spring MVC 是基於Servlet,在Http請求到達Servlet解析之前,GET過來的URL已經被Tomcat先做了一次URLDecode。Tomcat對GET方式預設的URL解碼結果是iso-8859-1而不是UT

$('selector').serialize()方法獲取到表單資料的錯誤

serialize() 方法通過序列化表單值,建立 URL 編碼文字字串。 例如:user=admin&password=admin&verify=abcd; 可以選擇一個或多個表單元素(比如 input 及/或 文字框),或者 form 元素本身。 序列化的值可在生成 AJ

正常啟動SparkStreaming之後,但是一直獲取資料

出現這樣子的問題之後,我們將setMaster的值進行了一點點的修改 local[2] 為什麼? 之前在進行setMaster的值時,當我們為local的時候,其實表示為local[1] 那麼就是告訴我們的程式,只執行一個處理執行緒。但是在現在通過socket的

axios傳送post請求java後端獲取資料原因及處理

場景/功能描述:     最近再學習前端的框架vue,發請求使用的是axios,自己簡單的寫了個後端,實現一個學生列表的crud,web層使用的是springmvc,並使用jq的$.ajax方式測試過介面沒問題。 出現的問題:     已經再次確保後端介面能接收jquery

微信小程式寫完之後的真機除錯獲取資料的問題

app.js中程式碼如下 import { Token } from 'utils/token-model.js'; var scence = 0; App({ onLaunch: function () { var that = this;

axios post 請求tomcat,攔截器獲取到getInputStream流中的資料

今天做專案,前端的大佬用axios傳送post請求,而我要利用過濾器和攔截器進行許可權的校驗,校驗的內容就是上送的某個欄位的內容,所以我們需要重寫request請求(request請求只能獲取一次,如果在攔截器中獲取,那麼控制器就獲取不到相應的引數),並且在攔截器中進行校驗,

php表單提交時獲取到post資料解決方法

博主執行PHP環境:windows+phpstorm+xampp 初學php,用echo $_POST["variable"]和var_dump($_POST) 都獲取不到post資料。 解決方法如下: 1.找到php.ini 配置檔案,查詢enable_p

jqGrid 單元格編輯 如何手動結束編輯、重置單元格編輯狀態 getChangedCells獲取資料處理

在上篇博文:jqGrid 單元格編輯 自定義下拉選擇框 動態資料來源 通用實現,討論瞭如何用custom edittype實現一個通用的下拉選擇框編輯方案,本文討論的是單元格編輯的另外兩個問題:如何手動結束編輯和如何重置編輯狀態。 1、基於單元格編輯常見使用流程 1)構建jqgrid