由 POST 400 錯誤拔出來的蘿蔔

2022-03-16 11:37:46 字數 2529 閱讀 3225

前段時間遇到掃瞄問題,好不容易拿到了掃瞄出來的資料,結果呼叫介面時彈了個 400(bad request) 給我,匆匆找了點資料修補上線後,忐忑的心也可以安分點。然後,順著這個 400 的蘿蔔,拔出了一大堆的坑。

400 錯誤的原因很簡單,請求頭部資訊與請求體中的資料格式不匹配,或者 前 -> 後 的資料中欄位型別不一致。在有效溝通的前提下,型別不一致的概率很小,那麼這個問題就主要集中在頭部資訊與請求體資料格式不一致上面了。

先看乙個正確的請求:

$.ajax(), //   es6 的乙個語法

success : function(result) ,

error:function(msg)

})

頂給你。

接著,需要設定 data。在傳送請求時,如果寫成:data: 的話,伺服器還是會返回 400 錯誤。其實理由也很簡單, http 通訊過程中,要麼就是字串,要麼就是二進位製流 ,而

是乙個物件,必須先轉化成字串或者流,才能傳輸。於是在請求中,首先得用 json.stringify 將 json 物件轉換成字串,這樣,伺服器才能正確理解請求並拿到資料。

綜上,在 post 請求中,一定要對這兩個屬性進行設定和處理。

這兩個 api 在前端的應用頻率也是相當高的,不過,因為某些原因,對 json.stringify 這個 api 理解上有些誤差。直到最近在查資料時才有了不一樣的領悟。

json.parse 將乙個 (json) 字串轉換成 (json) 物件,它有個名字是 反序列化;

json.stringify 作用與 json.parse 相反,將物件轉化成字串,所以它也有個名字是 序列化。

序列化 (serialization)是將物件的狀態資訊轉換為可以儲存傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。

尤想起,當年寫 class 的時候,序列化與反序列化齊飛,直至今日才明白官方定義...溜了溜了...

最常見的 post 提交資料的方式,原生 form 表單預設的提交方式,同時,如果在 ajax 中不設定的話,同樣以這種方式提交。

這種方式提交的資料會轉換成鍵值對並按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都會進行url 編碼。如:

常用於多檔案上傳。這種方式將表單資料處理成一條訊息,以標籤為單元,用分隔符(常見的是 boundary)分開。因為這種方式將資料分割為多個部分,所以它既可以上傳鍵值對,也可以上傳檔案、多檔案。當上傳的字段是檔案時,會有 content - type 來說明檔案型別;content-disposition,用來說明欄位的一些資訊。每部分以 -boundary 開始,緊接著是內容描述資訊,然後是回車,最後是字段具體內容(字段、文字或二進位制等)。如果傳輸的是檔案,還要包含檔名和檔案型別資訊。訊息主體最後以 -boundary- 標識結束。

如:(沒太看明白)

這個頭應該會很熟悉,這也是日常用的比較多的請求/響應頭。這個訊息頭的作用是告訴服務端訊息主體是序列化後的 json 字串。

順手也貼乙個:

這個訊息型別是檔案已被設定為純文字形式,瀏覽器、伺服器收到這種型別的資料不會進行進一步的處理,開發者需要自行判斷處理。也支援傳送 json 字串。

這個型別意味著訊息自由性變大。

這兩訊息型別年代久遠...至少在 web 前端領域做實際專案的時候完全沒有碰到過。以 xml 文件的形式傳送資料。不過因為 xml 嚴謹結構,對 web 前端來說,這會產生更多的流量,基本被棄用。

然後這兩者的區別是前者預設使用 『us-ascii』 字符集編譯碼,後者預設 'utf-8' 字符集編譯碼;前者只能在訊息頭 content-type 中設定編譯碼格式才有效,後者在訊息頭或者在文件內部中設定均可以。

get請求400錯誤,post請求405錯誤

出現錯誤原因,後台接收引數part使用的是list,引數的屬性對不上,傳參使用的型別是string,改為post請求之後才發現 此種錯誤再次發生,確實是後台接受引數型別和前台所傳型別不符,導致400錯誤 附上錯誤對應 400 錯誤的請求。401 訪問被拒絕。iis 定義了許多不同的 401 錯誤,它...

Ajax中post方法400和404的問題

1.從400變成404 我相信有很多人都用過ajax技術來獲取資料,一般都是使用get來獲取的,但是敏感資訊就不能繼續用get了,於是就換成了post,但是用post的時候有時候發生一些奇怪的事情,比如直接訪問是400,加上header和data訪問是404,這就令人疑惑了,為什麼不是從一開始就報錯...

啟用Csrf後POST資料時出現的400錯誤

第一種解決辦法是關閉csrf public function init 第二種解決辦法是在form表單中加入隱藏域 request csrftoken 第三種解決辦法是www.cppcns.com在ajax中加入 csrf欄位 var csrftoken meta name csrf token a...