python+requests——發送post請求——各種情況


 
        

requests庫是 python3 中非常優秀的第三方庫,它使用 Apache2 Licensed 許可證的 HTTP 庫,用 Python 編寫,真正的為人類着想。

requests 使用的是 urllib3(python3.x中的urllib),因此繼承了它的所有特性。

Requests 會自動實現持久連接keep-alive,Requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會話,支持文件上傳,

支持自動確定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼,現代、國際化、人性化。

Requests庫中有7個主要的函數,分別是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。

這七個函數中request()函數是其余六個函數的基礎函數,其余六個函數的實現都是通過調用該函數實現的。

 
        

 

 

 
        

 

 

 

 

 

 

 
        

 

 

json和dict
python中的dict類型要轉換為json格式的數據需要用到json庫:

import json
 
<json> = json.dumps(<dict>)
<dict> = json.loads(<json>)
需要注意的是python中並沒有json類型這一說法,通過json.dumps(<dict>)轉換的字典對象,最后得到的是一個字符串對象,

 

也就是說,在python中json格式的數據實際上就是一個字符串

>>> j = json.dumps(<dict>)
>>> type(j)
<class 'str'>
雖說json格式的數據在python中是以字符串的類型存在的,但是通過str(<dict>)工廠函數所得到的結果同json.dumps(<dict>)方法所得到的結果是不相同的


以看出來stringjs的區別在於引號。對於可以作為json.loads(<str>)參數對象的字符串,除了要滿足字典類型的格式外,所有的字符串對象必須是雙引號。


Python Requests post 方法中 data 與 json 參數問題

1.data參數

你想要發送一些編碼為表單形式的數據——非常像一個 HTML 表單。要實現這個,只需簡單地傳遞一個字典給 data 參數。你的數據字典在發出請求時會自動編碼為表單形式,header默認Content-Type: application/x-www-form-urlencoded,

發送過來的抓包到的數據格式為:'username=amy&password=123'

如果你傳遞一個 string 而不是一個 dict,那么數據會被直接發布出去,不會被編碼為表單形式

例如傳'{"username": "amy", "password": "123"}',直接發出去,抓包的內容也是'{"username": "amy", "password": "123"}'

2.json參數

還可以使用 json 參數直接傳遞,然后它就會被自動編碼,header默認'Content-Type': 'application/json'

json發送過來的數據格式為:{"username": "amy", "password": "123"}

3.實際場景中如何使用

1)對頁面接口抓包,如果Content-Type:application/json,則限制接受json格式,requests中可用json方法,

或者使用data方法,headers加'Content-Type': 'application/json',postdata傳string格式,不會自動編碼格式

2)對頁面接口抓包,Content-Type:application/x-www-form-urlencoded; charset=UTF-8,則可使用data方法

 

===================================================================================================

 

 

 

 

 

 


===============================================================================================================

帶參數的get請求:

參數在網頁url后面:"url": "http://httpbin.org/get?key1=value1&key2=value2"

import requests

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.get("http://httpbin.org/get", payload=payload )

print(r.text)

執行結果:
 
        

{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e501d6f-72b6f98a2655a02975b0fc47"
},
"origin": "122.194.13.251",
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}


====================================================================================================









import requests




print('#------------------------------------------------------------------------------------------1')



#發送不帶參數、不帶響應體的post請求:



r = requests.post('http://httpbin.org/post')








print('#------------------------------------------------------------------------------------------2')


#發送帶請求體參數的post請求,key:value:默認類型為即:content-type為application/x-www-form-urlencoded




# x-www-form-urlencoded

# 當action為get時候,瀏覽器用x-www-form-urlencoded的編碼方式把form數據轉換成一個字串(name1=value1&name2=value2…)
# ,
# 然后把這個字串append到url后面,用?分割,加載這個新的url。


#pplication/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼為key/value格式發送到服務器(表單默認的提交數據的格式)



payload = (('key1', 'value1'), ('key1', 'value2'))

r = requests.post('http://httpbin.org/post', date=payload)




print('#------------------------------------------------------------------------------------------3')


#發送帶響應體的post請求,json文件

#multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

#如果提交表達,即需要設置content-type 即 設置 header


下面:發送content-type為json格式的請求體

import requests
import json

payload = (('key1', 'value1'), ('key1', 'value2'))

header = { 'content-type':'application/json'}

r = requests.post('http://httpbin.org/post', json.dumps(payload),headers=header) #注意:將payload參數轉化為字典類型


--------------------------------------------------------------------------------------------------------------

方法二:


import requests
import json

payload = (('key1', 'value1'), ('key1', 'value2'))

r = requests.post('http://httpbin.org/post', json(payload)) #注意:將payload參數轉化為字典類型

===============================================================================================================

multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

即大型文件:比如excel、視頻文件等
import requests

x = {'file':open('C:\\Users\\del\\Desktop\\新建文本文檔 (3).txt','rb')}

r = requests.post('http://httpbin.org/post', files = x)

print(r.text)


-------------------------------------------------------------------------------------

當然,也可以指定這個文件的一些描述信息,詳細的如下:


POST一個多部分編碼(Multipart-Encoded)的文件

Requests 使得上傳多部分編碼文件變得很簡單:

>>> url = 'http://httpbin.org/post'

>>> file = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=file)

>>> r.text


{
...
"files": {
"file": "<censored...binary...data>"
},
...
}

 

 


你可以顯式地設置文件名,文件類型和請求頭:

url = 'http://httpbin.org/post'


files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

 

r = requests.post(url, files=files)

 

 r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
如果你想,你也可以發送作為文件來接收的字符串:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\nanother,row,to,send\\n"
},
...
}
如果你發送一個非常大的文件作為 multipart/form-data 請求,你可能希望將請求做成數據流。

默認下 requests 不支持, 但有個第三方包 requests-toolbelt 是支持的。你可以閱讀 toolbelt 文檔 來了解使用方法。














=============================================================================================================
Accept-Encoding:跟壓縮有關,瀏覽器發送http請求給web服務器,http請求中的header有Accept-Encoding:gzip,deflate(告訴服務器,瀏覽器支持gzip壓縮)



Content-Length:發送給HTTP服務器數據的長度。

 


Content-Type:即是Internet Media Type,互聯網媒體類型;也叫做MIME類型,在Http協議消息頭中,使用Content-Type來表示具體請求中的媒體類型信息。

              例如:Content-Type: application/x-www-form-urlencoded

常見的媒體格式類型如下:

text/html : HTML格式

text/plain :純文本格式 

text/xml : XML格式

image/gif :gif圖片格式 

image/jpeg :jpg圖片格式

image/png:png圖片格式

以application開頭的媒體格式類型:

application/xhtml+xml :XHTML格式

application/xml : XML數據格式

application/atom+xml :Atom XML聚合格式 

application/json : JSON數據格式

application/pdf :pdf格式

application/msword : Word文檔格式

application/octet-stream : 二進制流數據(如常見的文件下載)

application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼為key/value格式發送到服務器(表單默認的提交數據的格式)

另外一種常見的媒體格式是上傳文件之時使用的:

multipart/form-data : 需要在表單中進行文件上傳時,就需要使用該格式

注意:gzip、compress以及deflate編碼都是無損壓縮算法,用於減少文件傳輸大小,不會導致信息丟失,其中gzip效率最高,使用最廣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM