1. 程式人生 > 實用技巧 >python-requests(四):呼叫上傳檔案的介面的解決方案

python-requests(四):呼叫上傳檔案的介面的解決方案

說明:本文轉載自:http://www.lemfix.com/topics/43426

request官方網站地址:https://www.osgeo.cn/requests/user/advanced.html#post-multiple-multipart-encoded-files

前言

滴滴滴! 今天聊聊介面自動化,遇到檔案上傳的介面怎麼去測試。

近期也有不少的小夥伴在工作中遇到了檔案上傳的介面,表示不知道應該如何去傳遞檔案上傳的引數。

為了幫大家解決這個疑惑,我這邊特地寫了一個檔案上傳的介面,那麼接下來我們結合這個介面給大家來講講解決方案。

介面說明

  • 介面地址:http://127.0.0.1:5000/upload
    (注:老師自己寫的一個介面,執行在本地)
  • 請求方法:POST
  • 請求型別:Content-Type: multipart/form-data;
  • 響應型別: Content-Type:application/json
  • 介面入參
    引數名引數型別說明
    nickname string 使用者暱稱
    age int 年齡
    sex string 性別
    pic file(檔案) 上傳的檔案
  • 出參(返回值)
    欄位名型別說明
    code int 業務碼(1代表上傳成功,0程式碼上傳失敗)
    data obj 相關的資料資訊
    msg string 相關的描述資訊

    返回參考示例:

    {
        "code": 1,
        "data": {
            "age": "456",
            "datetime": "Thu, 12 Mar 2020 16:22:57 GMT",
            "filename": "handle_sign.py",
            "name": "123",
            "sex": ""
        },
        "msg": "檔案上傳成功,檔案儲存的地址為:http://127.0.0.1:5000/images/handle_sign.py"
    }
    

針對上面的介面文件簡要的說明一下:

該介面需要四個引數,其中一個是用來接收上傳的檔案的,看上去和其他的介面並沒有什麼不一樣的,返回的資料是json型別的;

關於檔案上傳介面,需要我們引起注意的一個地方就是:

請求引數型別都是Content-Type: multipart/form-data;

那麼這種型別的引數,我們在傳送請求的時候要特別注意!他

傳參的方式和其他引數型別是不一樣的。接下來我們分別使用postman和python來請求這個介面。

使用postman上傳檔案

使用postman來上傳檔案,操作起來比較簡單。

關於介面引數直接選擇form-data這一欄進行填寫就好了,要注意的點就是上傳檔案的引數,要選擇檔案型別,然後再對應引數值那一欄選擇對應的檔案即可,點選請求,伺服器返回了上傳成功的相關資訊,詳細操作如下圖:

使用requests模組來上傳

前面我們已經成功的使用了postman來上傳檔案,那麼我們在使用python去做介面自動化的時候,如何來解決這個檔案上傳的問題呢?

在python中關於傳送http請求,我們通常都會使用requets模組,那麼接下來我們就使用requests模組來上傳檔案。

requests模組傳送post請求直接呼叫post方法就可以了,那麼關於檔案上傳這裡傳參的時候要特別注意,

requests傳參型別:

requests模組傳參有四種方式:params、data,、json和files。接下來給大家詳細講解一下requests模組中這幾種傳參方式的區別。

  • parmas: 傳遞查詢字串引數(常用於get請求)

  • data: 傳遞表單型別的引數(引數型別為:Content-Type:application/x-www-form-urlencoded)

  • json: 傳遞json型別的引數(引數型別為:Content-Type:application/json)

  • files: 用於上傳檔案(引數型別: content-type:multipart/form-data;)

上傳檔案的的介面引數的型別為content-type:multipart/form-data,那麼我們使用requests來發送請求的時候,介面中檔案上傳的引數需要使用files來傳遞。files引數格式如下

# fiels為字典型別資料,上傳的檔案為鍵值對的形式,引數名作為鍵,
# 引數值是一個元組,內容為以下格式(檔名,開啟的檔案流,檔案型別)
files = {
    "pic": ("test01.gif", open("test01.gif", "rb"), "images/git")
}
# 注意點:除了上傳的檔案,介面其他引數不能放入files中

檔案上傳的引數準備好了,那麼介面中其他的引數怎麼處理呢?其他的引數使用data傳遞即可。引數組織如下:

# 其他的引數
data = {
    "nickname": "木森",
    "age": 18,
    "sex": "男",
}

引數都準備好了,那麼接下來就可以傳送請求了,完整的請求程式碼如下:

 1 """
 2 ============================
 3 Author:檸檬班-木森
 4 Time:2020/3/13   13:40
 5 E-mail:[email protected]
 6 Company:湖南零檬資訊科技有限公司
 7 ============================
 8 """
 9 
10 import requests
11 
12 # 如何請求檔案上傳的介面
13 url = "http://127.0.0.1:5000/upload"
14 
15 # 上傳的檔案引數
16 files = {
17     "pic": ("test01.gif", open("test01.gif", "rb"), "images/git")
18 }
19 # 其他的引數
20 data = {
21     "nickname": "木森",
22     "age": 18,
23     "sex": "",
24 }
25 # 傳送請求
26 response = requests.post(url=url, files=files, data=data)
27 # 列印結果
28 print(response.json())

執行以上程式碼,結果如下:

{
 'code': 1, 
 'data': {
     'age': '18', 
     'datetime': 'Fri, 13 Mar 2020 10:32:24 GMT', 
     'filename': 'test01.gif', 
     'name': '木森', 
     'sex': ''}, 
 'msg': '檔案上傳成功,檔案儲存的地址為:http://127.0.0.1:5000/images/test01.gif'
}

PS:很神奇有木有,上傳成功了,附上一張圖

關於檔案上傳的介面就給大家聊到這裡,如有其他問題,歡迎留言!