[平常] 跨語言的POST請求問題的解決

部門對外提供了一個HTTP的POST接口,可是對方公司的程序員使用C語言進行的調用,PHP這邊一直沒法獲取到參數.遇到這種狀況是由於對方沒有徹底按照HTTP協議中的POST發送數據.在HTTP頭部分沒有增長Content-Type: application/x-www-form-urlencoded頭,數據部分直接傳遞的json字符串,這樣就致使PHP這邊解析不到$_POST的數據,傳遞內容的字符串應該是以name=xxx&age=xxx這種形式傳遞前端

Content-Type是屬於HTTP的內容頭部,當增長這個頭部,而且數據格式正確時,PHP的$_POST纔可以獲取獲得數據
Content-Type:application/x-www-form-urlencoded,這個類型是ajax默認的content-type類型,這時前端能夠以對象方式直接給後端,或者以json方式傳給後端, 當action爲get時候,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2...),而後把這個字串append到url後面,用?分割,加載這個新的url。 當action爲post時候,瀏覽器把form數據封裝到http body中,而後發送到server。在瀏覽器控制檯能夠看到它們的內容都是以'From Data'形式展示程序員

Content-Type:application/json
若是ajax的頭部是application/json,那麼post時,數據必須以json格式傳給後端,這時後端在$_POST中不能直接接受到數據,必須用$GLOBALS['HTTP_RAW_POST_DATA']取出來,而後再json_decode就好了。
if($GLOBALS['CONTENT_TYPE']=='application/json'){
$_POST=json_decode($GLOBALS['HTTP_RAW_POST_DATA']);
}ajax

Content-Type:multipart/form-data是上傳文件時指定的編碼格式json

還有就是當請求HTTPS的數據時,須要指定CA證書的位置,或者忽略掉CA驗證,PHP請求HTTPS資源的時候使用curl擴展有參數能夠忽略驗證,若是是使用curl命令,那該命令使用的證書的位置是在/etc/pki/tls/certs/ca-bundle.crt後端

當使用cur沒法訪問HTTPS資源的時候,就須要下面的操做
1.須要下載CA證書 文件地址是 http://curl.haxx.se/ca/cacert.pem
2.把下載的文件放到這個位置 /etc/pki/tls/certs/ca-bundle.crt瀏覽器

相關文章
相關標籤/搜索