requests- 處理 multipartform-data 類型的上傳接口


multipart/form-data 類型的上傳接口

我們在做接口測試工作時,會遇到含有文件上傳的接口。

抓到的上傳接口的信息大概是以下這樣子:

請求體的 content-type 為:
multipart/form-data; boundary=---------------------------(一堆數字)

 

 

請求體當中,除了有要上傳的文件以外,還有其它的數據字段。

在下面的請求體截圖當中,含有以下字段:

 

id: 文件的 id

name: 文件的名字

type: 文件的類型。如果是圖片則是 image/png。若是圖中的文本文件,則為 application/octet-stream

lastModifiedDate:上一次修改時間。截圖中為當前時間點

size: 文件的大小

file: 有文件名、文件類型、文件內容 3 項內容。

 

 

這樣的接口,用 requests 如何來發送呢?



requests 的 requests_toolbelt 模塊處理 multipart/form-data

1、安裝 requests_toolbelt

pip 命令: pip install requests_toolbelt

 

2、導入 requests_toolbelt 下的 MultipartEncoder 類

from requests_toolbelt import MultipartEncoder

 

3、MultipartEncoder 類應用

 

3.1 處理請求體

MultipartEncoder 類,有一個 fields 參數,用來傳遞請求數據以及文件。

在實例化 MultipartEncoder 類,傳遞 fields

fields: 字典類型。將請求數據放在此參數中

 

key 為下圖中的 name 的值。下圖中的 key 分別為:id,name,type,lastModifiedDate,size,file

 

對於 key 為 file 的,它的值為一個元組:(文件名稱,文件流對象(binary 模式打開文件),文件類型)。

示例:"file":("chromedriver.log", open(file_path,"rb"), "application/octet-stream")})

 

上傳文本文件的代碼(實例化 MultipartEncoder):

filesize = os.path.getsize(file_path)  # 獲取文件大小
m = MultipartEncoder(fields={"id":"lemon66",
                             "name":"chromedriver.log",
                             "type":"application/octet-stream", "lastModifiedDate":"Mon Nov 30 2020 20:21:44 GMT+0800 (中國標准時間)",
                             "size":str(filesize),
                             "file":("chromedriver.log",open(file_path,"rb"),"application/octet-stream")})

 

上傳圖片的代碼(實例化 MultipartEncoder):

# 上傳文件為圖片:圖片類型不一樣。
file_path = 'D:\\BaiduNetdiskDownload\\lemon_log_1.png'
filesize = os.path.getsize(file_path) # 獲取文件大小

m = MultipartEncoder(fields={"id":"lemon66",
                         "name":"xiaojian.png",
                         "type":"image/png",
                         "lastModifiedDate":"Mon Nov 30 2020 20:21:44 GMT+0800 (中國標准時間)",
                         "size":str(filesize),
                         "file":("xiaojian.png",open(file_path,"rb"),"image/png")})

 

 

3.2 處理請求頭的 content-type

content-type 要包含 boundary。MultipartEncoder 類定義了屬性:content_type。

 

完整的上傳代碼為:

m = MultipartEncoder(fields={"id":"lemon66",
                         "name":"chromedriver.log",
                         "type":"application/octet-stream",
                         "lastModifiedDate":"Mon Nov 30 2020 20:21:44 GMT+0800 (中國標准時間)",
                         "size":str(filesize),
                         "file":("chromedriver.log",open(file_path,"rb"),"application/octet-stream")})
# content-type
# m.content_type

# 發送上傳文件的請求:
resp = s.post(upload_url,data=m,headers={'Content-Type': m.content_type})

 


免責聲明!

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



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