1. 程式人生 > >Http Post請求四種請求提的python實現

Http Post請求四種請求提的python實現

成了 由於 ini nbsp des cal 方法 orm 意義

Http Post請求四種請求提的python實現


歡迎轉載,也請在明顯位置註明出處 :https://www.cnblogs.com/Detector/p/9404391.html 謝謝!

HTTP的報文結構

技術分享圖片

上圖清晰的展示了HTTP 消息的結構。詳情如下:

請求行:即第一排用空格分割成的三個小塊,分別對應請求方法、請求URL、HTTP協議版本三個部分。
請求頭:從第二行開始到倒數第二行都是我們的請求頭(headers)。
消息主體:截圖的最後一行是請求體,也就是我們要發送的數據的主體,消息主體(entity-body)。
也就是說一個正常的post請求主要由請求行,請求頭,消息主體組成。接下來我們來了解一下什麽是Content-Type。

Content-Type的定義

要了解Content-Type首先我們要先對HTTP/1.1 協議有一定的了解。

眾所周知,HTTP/1.1 規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 8種,其中 POST 一般用來向服務端提交數據。
但是可能很多人不知道的是,雖然HTTP/1.1協議規定 了POST 提交的數據必須放在消息主體(entity-body)中,但並沒有規定數據必須使用什麽樣的編碼方式。也就是說,開發者完全可以自己決定消息主體的格式。

但是數據除了請求方發送之外,還要服務端能夠解析才有意義。而這個解析操作的第一步通常就是是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體的編碼方式,然後再對數據進行對應的解析操作。也就是說請求頭中的Content-Type字段用於規定請求體的編碼格式,服務端代碼需要使用它對接收到的消息主體進行解析。

Content-Type的格式種類

我們前面說了HTTP/1.1沒有規定協議編碼方式,但是隨著協議的應用推廣,已經慢慢的形成了四種最常用的編碼方式,基本上形成了相應的規範,即基本固定的Content-Type取值application/x-www-form-urlencoded(默認格式)、application/json、text/xml、multipart/form-data,與默認傳遞的urlencoded、json格式、xml格式、文件格式一 一對應。

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)

技術分享圖片

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。

技術分享圖片

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)

技術分享圖片

Http Post請求四種請求提的python實現