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)
# 測(cè)試環(huán)境
# url = "https://xxx"
# 生產(chǎn)環(huán)境
url = "https://xxx"
# 定義字符集
chars = string.ascii_lowercase+string.digits+string.ascii_uppercase
# 生成長(zhǎng)度為32的隨機(jī)字符串
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'這個(gè)可以通過(guò)apifox等軟件post一次后看請(qǐng)求內(nèi)容獲取
'file': ('xxx.csv', open('xxx.csv', 'rb'), 'application/octet-stream'),
# 'file': ('xxx.csv'), open(xxx.csv', 'rb'), 'application/octet-stream'),
})
# 配置請(qǐng)求頭
headers = {
# 'Authorization': 'Bearer xxx', # 測(cè)試環(huán)境
'Authorization': 'Bearer xxx', # 生產(chǎn)環(huán)境
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Accept': '*/*',
# 'Host': 'xxx', # 測(cè)試環(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)補(bǔ)充:
python 使用requests post請(qǐng)求發(fā)送form-data類型數(shù)據(jù)
某些post接口,需要發(fā)送multipart/form-data類型的數(shù)據(jù),如何使用python requests來(lái)模擬這種類型的請(qǐng)求發(fā)送呢?
根據(jù)http/1.1rfc 2616的協(xié)議規(guī)定,我們的請(qǐng)求方式有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等。
http協(xié)議規(guī)定以ASCII碼傳輸,建立在tcp,ip協(xié)議之上的引用規(guī)范。規(guī)范內(nèi)容把http請(qǐng)求分成3個(gè)部分:狀態(tài)行,請(qǐng)求頭,請(qǐng)求體。所有的方法,實(shí)現(xiàn)都是圍繞如何使用和組織這三部分來(lái)完成了,萬(wàn)變不離其宗。
post請(qǐng)求有兩種編碼格式:application/x-www-form-urlencoded 和multipart/form-data
- application/x-www-form-urlencoded 常用在前端表單提交時(shí),參數(shù)格式為:key=value&key=value。
- 如果參數(shù)中有特殊字符,則要進(jìn)行url編碼,編碼格式就是application/x-www-form-urlencoded(規(guī)則:將鍵值對(duì)的參數(shù)用&連接起來(lái);有空格轉(zhuǎn)換為+加號(hào);有特殊符號(hào)轉(zhuǎn)換為ASCII HEX值)。
如:參數(shù)值中有&,需要轉(zhuǎn)換為ASCII HEX值%26,對(duì)應(yīng)ASCII中38位置的&。 - application/x-www-form-urlencoded是瀏覽器默認(rèn)的編碼格式。對(duì)于Get請(qǐng)求,是將參數(shù)轉(zhuǎn)換為?key=value&key=value格式,連接到url后。

multipart/form-data
multipart/form-data格式不僅可以傳輸參數(shù),還可以傳輸文件。也是在post基礎(chǔ)上演變而來(lái)的,具體如下:
- multipart/form-data的基礎(chǔ)方式是post,即基于post請(qǐng)求來(lái)實(shí)現(xiàn)的。
- multipart/form-data與普通post方法的不同之處在于請(qǐng)求頭和請(qǐng)求體。
- multipart/form-data的請(qǐng)求頭必須包含一個(gè)特殊的頭信息:Content-Type,其值也必須為multipart/form-data;同時(shí)還需要規(guī)定一個(gè)內(nèi)容分割用于分割請(qǐng)求體中不同參數(shù)的內(nèi)容。
具體的頭信息如下:Content-Type: multipart/form-data; boundary=${bound} - multipart/form-data的請(qǐng)求體也是一個(gè)字符串,和普通post請(qǐng)求的不同之處在于它的構(gòu)造方式。普通post請(qǐng)求是簡(jiǎn)單的鍵值對(duì)連接,而multipart/form-data則是添加了分隔符、參數(shù)描述信息等內(nèi)容的構(gòu)造體。


關(guān)于boundary:
- 上面說(shuō)到普通post請(qǐng)求使用 & 來(lái)分隔參數(shù),那服務(wù)器使用
multipart/form-data格式接收POST請(qǐng)求時(shí),使用何種方式來(lái)分割參數(shù)的呢?答案是boundary。 - 由上圖可以發(fā)現(xiàn),HTTP的Body中使用兩個(gè)短橫線”–”加上boundary字符串作為不同參數(shù)的分割,而且不管是值參數(shù)(Value)還是文件參數(shù)(File)在Boundary內(nèi)部都有自己的描述信息,并不是URL參數(shù)的簡(jiǎn)單移動(dòng)。
并且在結(jié)束的時(shí)候,不僅前綴要加雙短橫線,后綴也要加,代表結(jié)束。

boundary快問(wèn)快答:
Q:boundary的值是用戶可以自由定義的嗎?
A:是的,但為了避免和正常文本重復(fù)了,盡量要使用復(fù)雜一點(diǎn)的內(nèi)容。
Q:boundary的作用?
A:分割參數(shù),類似于普通post請(qǐng)求中的 &
使用python發(fā)送multipart/from-data類型數(shù)據(jù)
有兩種方式:
- 手動(dòng)組建form-data并修改headers
- 通過(guò)files參數(shù)傳遞form-data,推薦此種方式,這里只說(shuō)這種方式
在官方網(wǎng)站上,requests模擬一個(gè)表單數(shù)據(jù)的格式如下:
files = {{name}: (<filename>, <file object>,<content type>, <per-part headers>)}
這一行模擬出來(lái)的post數(shù)據(jù)為:
Content-Disposition: form-data; name={name};filename=<filename>
Content-Type: <content type>
<file object>
--boundary
注:如果filename 和 content-Type不寫(xiě),那么響應(yīng)模擬post的數(shù)據(jù)就不會(huì)有二者。
通過(guò)上述說(shuō)明,我們可以構(gòu)造出files后直接post請(qǐng)求發(fā)送即可:
files = {
'schoolId': (None, -1),
'schoolName': (None, ""),
"reward": (None, 5),
"publishText": (None, "測(cè)試測(cè)試"),
"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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 輸出詳細(xì)的異常信息(traceback)方式
這篇文章主要介紹了Python 輸出詳細(xì)的異常信息(traceback)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
spark?dataframe全局排序id與分組后保留最大值行
這篇文章主要為大家介紹了spark?dataframe全局排序id與分組后保留最大值行實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中
這篇文章主要介紹了Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中,文章介紹內(nèi)容詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-03-03
解決Django transaction進(jìn)行事務(wù)管理踩過(guò)的坑
這篇文章主要介紹了解決Django transaction進(jìn)行事務(wù)管理踩過(guò)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04

