1. 程式人生 > >【Python】Http Post請求四種請求體的Python實現

【Python】Http Post請求四種請求體的Python實現

article gif 提交 直接 方法 method 根據 encode 文獻

前言

前幾天一個剛接觸Python不深的朋友問我的Python的xml格式Post請求怎麽發送,剛好最近也在看Http請求相關的內容,所以決定總結一下。
技術分享圖片

Content-Type

Content-Type的作用

HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交數據。一個正常的post請求主要包括請求行,請求頭,請求主體。協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須使用什麽編碼方式。實際上,開發者完全可以自己決定消息主體的格式,只要最後發送的 HTTP 請求滿足上面的格式就可以。

但是,數據發送出去,還要服務端解析成功才有意義。一般服務端語言如 php、python 等,都內置了自動解析常見數據格式的功能。服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是何種方式編碼,再對主體進行解析。

技術分享圖片

上圖是一個實際的請求報文,其中第一排的三個元素分別是請求方法、請求URL、HTTP協議及版本,統稱為請求行,分別是請求方法,資源名稱,HTTP版本號,從第二行開始一直到倒數第二行都是請求頭,最後一行是請求體。

Content-Type的格式種類

Content-Type的格式常見的有四種

- application/x-www-form-urlencoded(默認格式)
- application/json
- text/xml
- multipart/form-data

演示代碼說明

我們本次使用http://httpbin.org/來做演示。httpbin是一個專門用來測試 HTTP 請求及響應的網站,其github開源地址是https://github.com/requests/httpbin。作者另外一個開源庫就是大名鼎鼎的requests。

application/x-www-form-urlencoded格式

這是post請求最常見也是默認的數據提交格式。它要求數據名稱(name)和數據值(value)之間以等號相連,與另一組name/value值之間用&相連。例如:parameter1=12345&parameter2=23456。將請求的內容進行格式化了,其實這個方法同時簡化的客戶端發送,也簡化了服務器端獲取,服務器通過getParameters(String name)即可獲取到傳送來的信息。這是最常見post提交數據的方式,以form表單形式提交數據。

參考Python實現

import requests
datas = {"param1": "Detector", "param2": "cnblogs"}
r = requests.post("http://httpbin.org/post", data=datas)
print(r.text)
print(r.status_code)

我們在代碼中沒有進行Content-Type的設置,但是我們來看看Fiddler抓包的結果。
技術分享圖片

可以看到Content-Type已經被自動填充為application/x-www-form-urlencoded了。

application/json格式

application/json 這個 Content-Type 作為響應頭大家肯定不陌生。實際上,現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化後的 JSON 字符串。由於 JSON 規範的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什麽麻煩。

參考Python實現

import json
import requests
headers = {'Content-Type': 'application/json'}
datas = json.dumps({"param1": "Detector", "param2": "cnblogs"})
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

Fiddler抓包結果
技術分享圖片

text/xml數據格式

它是一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規範。典型的 XML-RPC(XML Remote Procedure Call) 請求數據是這樣的:

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>

參考Python實現

import requests
headers = {"Content-Type": "text/xml"}
datas = """<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value><i4>41</i4></value>
        </param>
    </params>
</methodCall>"""
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

可以看到,我們和application/json請求的區別是,我們把請求的內容換成了xml格式的字符串,Content-Type換成了text/xml。

Fiddler抓包結果
技術分享圖片

multipart/form-data數據格式

multipart/form-data主要用於文件上傳,當我們使用它時,必須讓 form表單的enctype 等於 multipart/form-data。直接來看一個請求示例,主要實現了上傳本地的test.txt文件:

參考Python實現

import requests
files = {"file": open("C:/Users/Administrator/Desktop/test.txt", "rb")}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

Fiddler抓包結果
技術分享圖片

參考文獻
https://www.cnblogs.com/aaronjs/p/4165049.html
https://blog.csdn.net/u010256388/article/details/68491509
https://www.jianshu.com/p/3c790e98ea8d
https://www.cnblogs.com/softidea/p/5745369.html
https://blog.csdn.net/qq_39640877/article/details/80951327

【Python】Http Post請求四種請求體的Python實現