python requests完成接口文件上傳的案例
最近在準(zhǔn)備一個(gè)公開(kāi)課,主題就是利用不同的語(yǔ)言和不同的工具去實(shí)現(xiàn)文件的上傳和下載。
在利用Jmeter去實(shí)現(xiàn)功能的時(shí)候,以及利用loadrunner去寫(xiě)腳本的時(shí)候,都很順利,沒(méi)有任何問(wèn)題,當(dāng)我嘗試用Python去解決這個(gè)問(wèn)題的時(shí)候,花了一些時(shí)間。
這也讓我在學(xué)習(xí)和嘗試中,找到了很多樂(lè)趣,下面給大家分享下,如何去實(shí)現(xiàn)操作。
前提:1:有一個(gè)上傳接口,地址如下:http://xx.xx.xx.xx//upload/stream(公司的服務(wù),地址不便外發(fā)~有興趣的同志可以來(lái)看我們的公開(kāi)課!)
2:上傳接口的參數(shù)如下所示:
{'parentId':'','fileCategory':'personal','fileSize':179,'fileName':'summer_text_0920.txt','uoType':1}
其中有兩個(gè)參數(shù)需要跟大家解釋一下:filesize:指的是文件的字節(jié)大小。 filename:指的是你上傳之后保存的文件名~記得不要搞錯(cuò)了后綴喲。其他的參數(shù)可以忽略,在做自己公司接口的時(shí)候,就按照自己公司的接口文檔去做即可。
開(kāi)始操作:1:安裝requests模塊,安裝命令:pip install requests
2:發(fā)送請(qǐng)求,代碼如下所示:
header={'ct':'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'}files = {’file’:open(’D:test_datasummer_test_data_05.txt’,’rb’)}#此處是重點(diǎn)!我們操作文件上傳的時(shí)候,把目標(biāo)文件以open打開(kāi),然后存儲(chǔ)到變量file里面存到一個(gè)字典里面upload_data={'parentId':'','fileCategory':'personal','fileSize':179,'fileName':'summer_text_0920.txt','uoType':1}upload_res=requests.post(upload_url,upload_data,files=files,headers=header)##此處是重點(diǎn)!我們操作文件上傳的時(shí)候,接口請(qǐng)求參數(shù)直接存到upload_data變量里面,在請(qǐng)求的時(shí)候,直接作為數(shù)據(jù)傳遞過(guò)去查看結(jié)果:
執(zhí)行完代碼后,看到我們上傳成功,效果如下:
大家如果有上傳文件的接口,趕緊去試試吧!
學(xué)習(xí)了代碼后,有些事情就會(huì)顯得輕松多啦!
補(bǔ)充:python實(shí)現(xiàn)接口上傳文件的兩種方法
文件上傳:上傳圖片的類型是file,這里沒(méi)有用到頭部信息import requestsdef sendImg(img_path, img_name, img_type=’image/jpeg’): ''' :param img_path:圖片的路徑 :param img_name:圖片的名稱 :param img_type:圖片的類型,這里寫(xiě)的是image/jpeg,也可以是png/jpg ''' url = ’https://www.xxxxxxxxxx.com’ # 自己想要請(qǐng)求的接口地址 with open(img_path + img_name, 'rb')as f_abs:# 以2進(jìn)制方式打開(kāi)圖片 body = { # 有些上傳圖片時(shí)可能會(huì)有其他字段,比如圖片的時(shí)間什么的,這個(gè)根據(jù)自己的需要 ’camera_code’: (None, '攝像頭1'), ’image_face’: (img_name, f_abs, img_type) # 圖片的名稱、圖片的絕對(duì)路徑、圖片的類型(就是后綴) 'time':(None, '2019-01-01 10:00:00') } # 上傳圖片的時(shí)候,不使用data和json,用files response = requests.post(url=url, files=body).json return response if __name__==’__main__’: # 上傳圖片 res = sendImg(img_path, img_name) # 調(diào)用sendImg方法 print(res) **如果上傳圖片是數(shù)組時(shí),value直接寫(xiě)圖片路徑就可以**文件上傳:上傳的類型是file,用到頭部信息
# 'Content-Type': 'multipart/form-data; boundary=76a22e30da2bb7790828887966871012'from urllib3 import encode_multipart_formdataimport requestsdef sendFile(filename, file_path): ''' :param filename:文件的名稱 :param file_path:文件的絕對(duì)路徑 ''' url = 'https://www.xxxxxxx.com' # 請(qǐng)求的接口地址 with open(file_path, mode='r', encoding='utf8')as f: # 打開(kāi)文件 file = { 'file': (filename, f.read()),# 引號(hào)的file是接口的字段,后面的是文件的名稱、文件的內(nèi)容 'key': 'value', # 如果接口中有其他字段也可以加上 } encode_data = encode_multipart_formdata(file) file_data = encode_data[0] # b’--c0c46a5929c2ce4c935c9cff85bf11d4rnContent-Disposition: form-data; name='file'; filename='1.txt'rnContent-Type: text/plainrnrn...........--c0c46a5929c2ce4c935c9cff85bf11d4--rn headers_from_data = { 'Content-Type': encode_data[1], 'Authorization': token } # token是登陸后給的值,如果你的接口中頭部不需要上傳字段,就不用寫(xiě),只要前面的就可以 # ’Content-Type’: ’multipart/form-data; boundary=c0c46a5929c2ce4c935c9cff85bf11d4’,這里上傳文件用的是form-data,不能用json response = requests.post(url=url, headers=headers_from_data, data=file_data).json() return response if __name__==’__main__’: # 上傳文件 res = sendFile(filename, file_path) # 調(diào)用sendFile方法 print(res)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. 關(guān)于WPF WriteableBitmap類直接操作像素點(diǎn)的問(wèn)題2. JavaScript前端中的偽類元素before和after使用詳解3. ASP基礎(chǔ)入門第一篇(ASP技術(shù)簡(jiǎn)介)4. asp取整數(shù)mod 有小數(shù)的就自動(dòng)加15. 源碼分析MinimalApi是如何在Swagger中展示6. PHP laravel實(shí)現(xiàn)基本路由配置詳解7. ThinkPHP5實(shí)現(xiàn)JWT Token認(rèn)證的過(guò)程(親測(cè)可用)8. 熊海CMS代碼審計(jì)漏洞分析9. PHP JSAPI調(diào)支付API實(shí)現(xiàn)微信支付功能詳解10. 表單中Readonly和Disabled的區(qū)別詳解
