python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼
python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)
import datetime import json import random import string import requests from requests_toolbelt import MultipartEncoder # 在企業(yè)微信群里發(fā)消息 def log(day): url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx' headers = { "Content-Type":"application/json" } data = { "msgtype":"text", "text":{ "content":"xxx" } } response = requests.post(url=url,headers=headers,data=json.dumps(data)) print(response.status_code) print(response.text) # 測試環(huán)境 # url = "https://xxx" # 生產(chǎn)環(huán)境 url = "https://xxx" # 定義字符集 chars = string.ascii_lowercase+string.digits+string.ascii_uppercase # 生成長度為32的隨機字符串 random_str = ''.join(random.sample(chars, 32)) print(random_str) # 設(shè)置日期 day = ((datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")) # 配置數(shù)據(jù) data = MultipartEncoder({ 'requestId':random_str, 'docType':'invoice', # 'application/octet-stream'這個可以通過apifox等軟件post一次后看請求內(nèi)容獲取 'file': ('xxx.csv', open('xxx.csv', 'rb'), 'application/octet-stream'), # 'file': ('xxx.csv'), open(xxx.csv', 'rb'), 'application/octet-stream'), }) # 配置請求頭 headers = { # 'Authorization': 'Bearer xxx', # 測試環(huán)境 'Authorization': 'Bearer xxx', # 生產(chǎn)環(huán)境 'User-Agent': 'Apifox/1.0.0 (https://apifox.com)', 'Accept': '*/*', # 'Host': 'xxx', # 測試環(huán)境 'Host': 'xxx', # 生產(chǎn)環(huán)境 'Connection': 'keep-alive', 'Content-Type': data.content_type } print(data.content_type) # 返回結(jié)果 response = requests.post(url, headers=headers, data=data) print(response.text) if json.loads(response.text)['code'] == "200": print("ok") log(day)
補充:
python 使用requests post請求發(fā)送form-data類型數(shù)據(jù)
某些post接口,需要發(fā)送multipart/form-data類型的數(shù)據(jù),如何使用python requests來模擬這種類型的請求發(fā)送呢?
根據(jù)http/1.1rfc 2616的協(xié)議規(guī)定,我們的請求方式有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等。
http協(xié)議規(guī)定以ASCII碼傳輸,建立在tcp,ip協(xié)議之上的引用規(guī)范。規(guī)范內(nèi)容把http請求分成3個部分:狀態(tài)行,請求頭,請求體。所有的方法,實現(xiàn)都是圍繞如何使用和組織這三部分來完成了,萬變不離其宗。
post請求有兩種編碼格式:application/x-www-form-urlencoded 和multipart/form-data
- application/x-www-form-urlencoded 常用在前端表單提交時,參數(shù)格式為:key=value&key=value。
- 如果參數(shù)中有特殊字符,則要進行url編碼,編碼格式就是application/x-www-form-urlencoded(規(guī)則:將鍵值對的參數(shù)用&連接起來;有空格轉(zhuǎn)換為+加號;有特殊符號轉(zhuǎn)換為ASCII HEX值)。
如:參數(shù)值中有&,需要轉(zhuǎn)換為ASCII HEX值%26,對應(yīng)ASCII中38位置的&。 - application/x-www-form-urlencoded是瀏覽器默認的編碼格式。對于Get請求,是將參數(shù)轉(zhuǎn)換為?key=value&key=value格式,連接到url后。
multipart/form-data
multipart/form-data格式不僅可以傳輸參數(shù),還可以傳輸文件。也是在post基礎(chǔ)上演變而來的,具體如下:
- multipart/form-data的基礎(chǔ)方式是post,即基于post請求來實現(xiàn)的。
- multipart/form-data與普通post方法的不同之處在于請求頭和請求體。
- multipart/form-data的請求頭必須包含一個特殊的頭信息:Content-Type,其值也必須為multipart/form-data;同時還需要規(guī)定一個內(nèi)容分割用于分割請求體中不同參數(shù)的內(nèi)容。
具體的頭信息如下:Content-Type: multipart/form-data; boundary=${bound} - multipart/form-data的請求體也是一個字符串,和普通post請求的不同之處在于它的構(gòu)造方式。普通post請求是簡單的鍵值對連接,而multipart/form-data則是添加了分隔符、參數(shù)描述信息等內(nèi)容的構(gòu)造體。
關(guān)于boundary:
- 上面說到普通post請求使用 & 來分隔參數(shù),那服務(wù)器使用
multipart/form-data格式
接收POST請求時,使用何種方式來分割參數(shù)的呢?答案是boundary。 - 由上圖可以發(fā)現(xiàn),HTTP的Body中使用兩個短橫線”–”加上boundary字符串作為不同參數(shù)的分割,而且不管是值參數(shù)(Value)還是文件參數(shù)(File)在Boundary內(nèi)部都有自己的描述信息,并不是URL參數(shù)的簡單移動。
并且在結(jié)束的時候,不僅前綴要加雙短橫線,后綴也要加,代表結(jié)束。
boundary快問快答:
Q:boundary的值是用戶可以自由定義的嗎?
A:是的,但為了避免和正常文本重復了,盡量要使用復雜一點的內(nèi)容。
Q:boundary的作用?
A:分割參數(shù),類似于普通post請求中的 &
使用python發(fā)送multipart/from-data類型數(shù)據(jù)
有兩種方式:
- 手動組建form-data并修改headers
- 通過files參數(shù)傳遞form-data,推薦此種方式,這里只說這種方式
在官方網(wǎng)站上,requests模擬一個表單數(shù)據(jù)的格式如下:
files = {{name}: (<filename>, <file object>,<content type>, <per-part headers>)}
這一行模擬出來的post數(shù)據(jù)為:
Content-Disposition: form-data; name={name};filename=<filename>
Content-Type: <content type>
<file object>
--boundary
注:如果filename 和 content-Type不寫,那么響應(yīng)模擬post的數(shù)據(jù)就不會有二者。
通過上述說明,我們可以構(gòu)造出files后直接post請求發(fā)送即可:
files = { 'schoolId': (None, -1), 'schoolName': (None, ""), "reward": (None, 5), "publishText": (None, "測試測試"), "tags": (None, 1), 'image': ('image.jpg', open('%s/resource/upload_images/image.jpg' % PATH_DIR, 'rb'), 'application/octet-stream') } response = requests.post(url, files=files)
豬豬俠要努力呀!
到此這篇關(guān)于python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的文章就介紹到這了,更多相關(guān)python使用requests.post方法傳遞Excel數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python高效過濾出文件夾下指定文件名結(jié)尾的文件實例
今天小編就為大家分享一篇python高效過濾出文件夾下指定文件名結(jié)尾的文件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Python實現(xiàn)自定義函數(shù)的5種常見形式分析
這篇文章主要介紹了Python實現(xiàn)自定義函數(shù)的5種常見形式,結(jié)合實例形式較為詳細的分析了Python自定義函數(shù)相關(guān)的參數(shù)、默認值、隱函數(shù)等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2018-06-06python的dataframe轉(zhuǎn)換為多維矩陣的方法
下面小編就為大家分享一篇python的dataframe轉(zhuǎn)換為多維矩陣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python中基礎(chǔ)的socket編程實戰(zhàn)攻略
Python擁有內(nèi)置的socket模塊,可以用簡潔明了的代碼來進行socket通信操作,這里我們就為大家整理了一份Python中基礎(chǔ)的socket編程實戰(zhàn)攻略,需要的朋友可以參考下.2016-06-06