如何判斷瀏覽器post的是form data還是json data?

在瀏覽器一個請求中如何判斷瀏覽器post請求的是form data還是json data? 以知乎爬蟲獲取followees為例。 Params是一個json的數據,我也是看別人代碼才發現的。但是一般情況下,如何判斷這個是什麼數據?下面是crome瀏覽器,posted data截圖。 謝謝回答


瀉藥。簡單答案是你題目中描述的「form-data」。長答案是題主你走偏了。

對於URL:

https://www.zhihu.com/node/ProfileFolloweesListV2

發送一個POST請求,簡單抓包就知道

headers為:

POST /node/ProfileFolloweesListV2 HTTP/1.1
Host: www.zhihu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
X-Xsrftoken: *我是馬賽克*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: https://www.zhihu.com/people/webbot/followees
Content-Length: 132
Cookie: *我是馬賽克*
DNT: 1
Connection: keep-alive

POST data 為:

method=nextparams=%我是經過URL編碼後的JSON字元串的馬賽克%

這個格式一看就是x-www-form-urlencoded (注意看headers中的Content-Type值和POST數據的編碼格式)。提交的欄位method為next,params是一段JSON字元串。

後端的邏輯極有可能是這樣:伺服器拿到請求後,先對payload部分進行拆分、解碼,得到各個欄位的值,這個URL相應的控制層代碼再對params處理轉換為JSON對象。

最後嘮叨幾句基礎知識。從HTTP協議本身來說,一個POST方法,是要在body部分寫數據的,這裡不妨稱之為 payload。payload可以有多種多樣,比如

1. 有些就直接解析原始payload,可以以任意形式組織,比如純文本、XML、JSON、或其他自定義格式。

2. 有些HTML表單提交採用固定格式如a=1b=2c=3,稱之為application/x-www-form-urlencoded

3. 有些HTML表單提交採用的是用分界線隔開的格式,稱之為multipart/form-data

所以,要在 form-data和json-data 二選一,似乎感覺走偏了。

另外,附個小經驗:

一般來說,payload如果是個JSON,經常會選擇在headers部分添加 『application/json』,這樣後台框架就可以直接轉換,不用後端程序員手工轉換。有時候這是必須的,比如後端利用的是Express的body-parser插件。

然而,payload如果是個XML,我遇到很多情況,都沒有添加相關headers頭,似乎大家都喜歡手工轉換。

最後,對於爬蟲,實在不行,就添加headers吧,儘可能按原樣重放報文。


http-header的content-type


Content-Type

application/x-www-form-urlencoded

application/json

複習下http。。。


post的數據還可以在url中。看看tornado的文檔,有說明。


推薦閱讀:

一個關於python3 requests庫使用代理訪問IP查詢網站的問題?
同一域名下同一性質部分網頁無法爬蟲,請問是什麼原因造成的,應該如何處理?
關於python返回裝飾後函數的結果?
如何用 Python 爬取社交網路(如微博)?
你用 Python 或者程序語言寫過哪些好玩或者實用的小應用?

TAG:知乎 | Python | 爬蟲計算機網路 | HTTP |