乙個content type引發的問題

2021-08-13 08:41:28 字數 3422 閱讀 2889

背景介紹:

問題:報警監控顯示專案的活動介面異常並報錯,提示json_decode解析異常,但不必現,無法立刻判斷原因。

先介紹下我們的資料傳遞流程:

監控時常顯示專案的某個介面報錯異常,報警提示如下:

圖2.報警郵件

過程分析:

很明顯,json_decode($_post['result'])出錯,解析的資料格式非標準encode格式

那麼檢視下decode的資料唄,看是什麼問題

answer=
php收到閘道器的$_post資料(錯亂),

"answer":""
顯然經過閘道器後,【answer欄位裡的值結構發生了變化】,導致解析失敗。

所以就是【閘道器】的問題唄。

結論為時過早,還真不全是他的問題

圖3.原始訪問資料截圖

php收到的file_get_contents('php://input')資料(正常)

answer=
由圖看php原始資料記錄可得,閘道器傳遞時資料格式顯示是正常的,格式錯誤是因為php底層給$_post賦值時(php生命週期第二步)錯誤造成,也就是說,是php的問題。但底層為什麼會錯亂呢?

問題解決:

兩種方式指定資料傳輸的content-type都為:

細心的同學應該發現乙個區別,圖3中用postman模擬的資料,key對的value是被轉義掉的,

php底層對$_post賦值是根據&切割的,但是閘道器傳來的資料沒有轉義,所以當value中有"&"值時自動分開造成錯誤切割。

臨時解決方案:php做正則處理,用file_get_contents('php://input')裡的方案。

$raw_str =file_get_contents('php://input');

preg_match("/&answer=(.*)}]&/",$raw_str,$res);

知識延伸:本次問題解決的過程中,曝露出了乙個問題,對http的content-type並不是十分熟悉,藉此機會延伸學習一下。

content-type:

作用:說明了實體主體內物件的**型別(mime)

包含型別:

text/html : html格式

text/plain :純文字格式

text/xml : xml格式

另外一種常見的**格式是上傳檔案之時使用的:

multipart/form-data : 需要在表單中進行檔案上傳時,就需要使用該格式

著重看這麼幾個:

就是http請求中的multipart/form-data,它會將表單的資料處理為一條訊息,以標籤為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳檔案。當上傳的字段是檔案時,會有content-type來表名檔案型別;content-disposition,用來說明欄位的一些資訊;

由於有boundary隔離,所以multipart/form-data既可以上傳檔案,也可以上傳鍵值對,它採用了鍵值對的方式,所以可以上傳多個檔案。

可以上傳任意格式的文字,可以上傳text、json、xml、html等

總結:

1.各php對各content-type的應用情況

http post傳輸

content-type

列印file_get_contents('php://input')

列印$_post

multipart/form-data

無資料 有

有 有 有

無資料

所以,只要特殊記一下,

當 content-type==json,用

file_get_contents('php://input')接收並且json_decode,$_post是無值的 當

content-type==form/data,不要用

file_get_contents('php://input')接受

2.form-data與urlencode小知識點

content-type:multipart/form-data body體傳送有邊界值

會把引數用&鏈結組裝,並且對value做轉義操作【很關鍵】,詳細解釋

php://input與

$http_raw_post_data區別

php://input訪問請求的原始資料的唯讀流。不依賴於特定的 php.ini 指令

$http_raw_post_data 包含 post 提交的原始資料,不建議使用,php7已經被廢棄

4.php 的curl與 linux傳送curl,在www_url_encode是否會轉譯資料

問題:1.php底層如何對$_post進行賦值的,注意 content-type:multipart/form-data下的情況

2.file_get_contents('php://input');原理,為什麼在content-type:multipart/form-data下無法捕獲到值

content-type:

php://input :

form-data、x-www-form-urlencoded、raw、binary:

資料互動截圖記錄:

圖1.multipart/form-data

乙個memset引發的血案

前幾天做了一道bst題,提交了幾次都是wa,今天抽空拿了出來仔細瞧瞧總算被我發現禍頭根源.總結原因還在於自己對memset不太了解,以前用對估計也是瞎貓撞見死耗子 memset的介紹 void memset void buffer,int ch,size t count buffer 指向某段記憶體...

乙個分號引發的「血案」

再多的表情也無法詮釋我現在的心情!a b for matrices 這是很水的一道題,然而卻整整折騰了我2個多小時。從晚上6點多開始,花了沒幾分鐘就把 敲好了,可是資料一測,竟然不對,然後就開始找問題,找了很久,我竟然都還沒看出問題在哪,越找心裡越不爽,這麼做明明對的呀,一執行怎麼就錯了呢?一直到了...

乙個軟體引發的崩潰

今天筆記本正常重啟後,出現 c000021a unknown hard error 的錯誤。無論是安全模式,命令列模式都無法正常登入系統,重視出現以上錯誤。看到這個錯誤貌似由於硬體錯誤,第乙個反應會不會是磁碟壞道,分析一下似乎又不是,搜尋也有遇到這種情況,但情況各不相同。沒有太多精力去分析原因,還好...