一劍化三清:
全真教上乘劍術,通過手腕抖動,能使每一劍均可化為三招,
為 楊過 和 小龍女 一同參研領悟所學,
因劍法傳到古墓,故為 王重陽 所創,并且為 林朝英 所得
Content-Type 是指 http/https 發送資訊至服務器時的內容編碼型別,用于 表明發送資料流的型別,服務器根據編碼型別使用特定的決議方式,獲取資料流中的資料,
下面詳細介紹一下常用的型別及如何使用 Python 模擬:
application/x-www-form-urlencoded
最常見的 POST 提交資料的方式了,瀏覽器原生 <form> 表單,如果不設定 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交資料,
首先,Content-Type 被指定為 application/x-www-form-urlencoded,其次,提交的資料按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 url 編碼,
form 表單
<form action="/" method="POST">
...
</form>
Fiddler 抓包分析

Python requests 模擬請求
import requests
data = {
'username': 'admin',
'password': 'admin'
}
response = requests.post('http://httpbin.org/post', data=data)
Requests 庫支持以 form表單形式發送 post請求,只需要將請求的引數構造成一個字典,然后傳遞給 `requests.post()` 的 `data` 引數即可
multipart/form-data
又是一個常見的 POST 資料提交的方式,我們使用表單上傳檔案的時候,必須將 <form> 表單的 enctype 設定為 multipart/form-data
-
multipart/form-data的基礎是 post 請求,即基于 post 請求來實作的 -
multipart/form-data形式的 post 與普通 post 請求不同之處體現在 請求頭,請求體 兩部分
請求頭
必須包含 Content-Type 資訊,且其值也必須規定為 multipart/form-data,同時還需要規定一個內容分割符用于分割請求體中不同引數的內容,具體的資訊格式如下:
Content-Type: multipart/form-data; boundary=${bound}
其中 ${bound} 是一個占位符,代表我們規定的具體分隔符,可以自己任意規定,但為了避免和正常文本重復,盡量使用復雜一點的內容,如:
Content-Type: multipart/form-data; boundary=e0722295b17a922fdd0c86a3f2cdd47d
-
請求體
--${bound} Content-Disposition: form-data; name="username" admin --${bound} Content-Disposition: form-data; name="password" admin --${bound} Content-Disposition: form-data; name="file"; filename="cookie_me.py" ... --${bound}--
其中 ${bound} 就是之前請求頭資訊中的分隔符,兩者需要保持一致,
另外,請求體被 分隔符 劃分為 3 個部分,每個部分就是一個引數的鍵值描述(類似普通post請求中 k1=v1 部分),但對引數資訊的描述可以比普通post請求更加豐富,這就是為什么 multipart/form-data 能發送檔案的原因,
每一個部分都是以 --${bound} 開始的,接著是該部分內容的描述資訊,然后是一個回車,最后是描述資訊的具體內容,最后的分隔符會以 -- 結尾,表示請求體結束
form 表單
<form action="/" method="POST" enctype="multipart/form-data">
...
</form>
Fiddler & Chrome Network 抓包分析

Python requests 模擬請求
# 僅傳遞檔案
files = {'file': open('./test.py', 'r')}
response = requests.post('http://127.0.0.1', files=files)
# 僅傳遞引數
data = {
'username': (None, 'admin'),
'password': (None, 'admin')
}
response = requests.post('http://127.0.0.1', files=data) # 此處為 files
# 檔案 + 引數
data = {
'username': 'admin',
'password': 'admin'
}
files = {'file': open('./test.py', 'r')}
response = requests.post('http://127.0.0.1', files=files, data=data)
注意:不需要設定
Content-Type: multipart/form-data請求頭此外,還可以采用 requests-toolbelt 庫構建引數
application/json
由于 JSON 規范的流行,越來越多程式把 application/json 作為請求頭,用來告訴服務端訊息主題是序列化后的 JSON 字串,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函式
JSON 格式支持比鍵值對復雜得多的結構化資料,可以視為 application/x-www-form-urlencoded 的升級版,特別適合 RESTful 介面
Fiddler & Chrome Network 抓包分析

Python requests 模擬請求
# 第一種方式
data = {
'username': 'zzzzls',
'password': 'zzzzls'
}
response = requests.post('http://127.0.0.1', json=data)
# 第二種方式
headers = {'Content-Type': 'application/json'}
data = {
'username': 'zzzzls',
'password': 'zzzzls'
}
response = requests.post('http://127.0.0.1', data=json.dumps(data), headers=headers)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/232495.html
標籤:其他
下一篇:二叉排序/搜索樹類模板
