一、接口分析
這里直接在前端進行上傳,通過Chrome瀏覽器的F12開發工具進行抓包,可以看到上傳文件接口的請求與相應信息,因為是公司的項目接口,會做一些馬賽克處理:
再看看請求參數:
我們可以從請求中看到,請求方式為multipart/form-data表單格式,並且注意到,雖然上傳了文件,但是請求參數中並沒有展示文件路徑和文件名,而且fileList值為“binary”,那么可以知道上傳的為文件的字節內容
二、postman示例
以postman示例,body選擇form-data選項,key填入fileList[]並選擇格式為file,在value中選擇一個本地文件進行上傳,然后發起請求:
結果接口請求成功~
三、requests示例
剛剛我們借助工具實現了上傳文件的請求,postman中可以將我們的請求轉化為python代碼格式,具體步驟如下:
1.先使用postman構建好參數並調試成功
2.點擊Save按鈕下方的Code
3.選擇語言為Python - Requests后復制代碼
4.將復制后的代碼粘貼到Pycharm或者VS code的開發工具中運行即可
import os import requests from Commons.constants import UPLOAD_DIR url = "https://接口地址/1.0/product/style-gallery" payload = {} files = [ ('fileList[]', open(os.path.join(UPLOAD_DIR, 'stylegallery.png'), 'rb')) ] headers = {} response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response.text.encode('utf8'))
至此就完成了文件上傳接口的處理,后續進行測試或者接口自動化在此基礎上進行二次開發即可~
四、方法二
如果上面的方式並不能解決問題,那么再采用第二種方法,基本就不會有問題。
我們先來看看上傳文件的請求內容:
接下來,給requests庫的請求參數files的值套用以下模板:
files = { '${name}': ('${filename}', open( '${filepath}', 'rb'), '${Content-Type}') }
- ${name}:即name的值"fileList[0]"
- ${filename}:即filename的值"a.jpg"
- ${filepath}:filename的文件路徑
- ${Content-Type}:即Content-Type的值"image/jpeg"
將模板對應的變量替換為實際值,得到:
files = { 'fileList[0]': ('a.jpg', open(os.path.join(UPLOAD_DIR, 'a.jpg'), 'rb'), 'image/jpeg') }
注意要確認文件路徑是否正確,我這里使用了相對路徑,然后將files傳遞給requests的對應方法上即可。