python-requests:怎么调通上传接口
Posted 青春无限坑!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-requests:怎么调通上传接口相关的知识,希望对你有一定的参考价值。
接口说明
-
接口地址:http://localhost:8500/cmsmanager/upload/o_upload(运行在本地)
-
请求方法:POST
-
请求类型:Content-Type: multipart/form-data;
-
响应类型: Content-Type:application/json
- header请求头
参数名 | 说明 |
---|---|
JEECMS-Auth-Token | 权限验证信息头,可从登陆成功之后返回信息中获取 |
- 接口入参
参数名 | 参数类型 | 说明 |
---|---|---|
addToRes | Boolean | 是否添加到资源库 |
spaceId | String | 资源文件夹ID |
uploadFile | file(文件) | 上传的文件 |
- 出参(响应结果)
名称 | 类型 | 初始值 | 说明 |
---|---|---|---|
code | Number | 200 | |
data | Object | ||
|— videoCover | Object | 封面图 | |
|— dimensions | String | 1368*599 | 图片的尺寸 |
|— fileSize | Number | 56 | 文件大小 |
|— fileUrl | String | /u/gou/www/201806/211453580wtv.png | 路径 |
|— origName | String | QQ图片20180621140542.png | 文件原始名称 |
|— resourceId | Number | 8 | 资源唯一标识符ID |
message | String | 操作成功! | |
redirectUrl | String | ||
requestUrl | String | ||
timestamp | Number | 1529564038299 |
返回参考示例:
"code": 200,
"data":
"dimensions": "1920*1080",
"duration": null,
"fileSize": 242,
"fileUrl": "/u/cms/www/202104/29152258msu5.jpg",
"origName": "365zhuti_20120326140308_0",
"resourceId": 25064,
"resourceType": 1,
"videoCover": null
,
"message": "操作成功",
"redirectUrl": "",
"requestUrl": "",
"timestamp": "2021-04-29 15:22:58",
"token": ""
针对上面的接口文档简要的说明一下:
该接口需要3个参数,其中一个是用来接收上传的文件的,看上去和其他的接口并没有什么不一样的,返回的数据是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 = "uploadFile":("1.jpg",open(r"G:\\photo\\1.jpg", "rb"),"image/jpeg")
# 注意点:除了上传的文件,接口其他参数不能放入files中
文件上传的参数准备好了,那么接口中其他的参数怎么处理呢?其他的参数使用data传递即可。参数组织如下:
# 其他的参数
data = "spaceId":"","addToRes":True
参数都准备好了,那么接下来就可以发送请求了,完整的请求代码如下:
import requests
# 登录接口
login_url = "http://localhost:8500/cmsmanager/login"
login_data = "identity": "system", "desStr": "EwSSctvjsSzm8sZN2B5mecOcSAGZeGEZ"
#上传接口
upload_url = 'http://localhost:8500/cmsmanager/upload/o_upload'
#上传的文件参数,以下两种写法都可
files_1 = "uploadFile":open(r"G:\\photo\\1.jpg", "rb")
files_2 = "uploadFile": ("1.jpg", open(r"G:\\photo\\1.jpg", "rb"), "image/jpeg")
# 上传的其他参数
upload_data = "spaceId": "", "addToRes": True
# 先登录,获取接口响应体中的token,然后传给下一个需要登录接口的请求header里面
login_resp = requests.post(url=login_url, data=login_data)
Token = login_resp.json()['data']['JEECMS-Auth-Token']
#请求头
headers = "JEECMS-Auth-Token": Token
# 请求上传接口
upload_resp = requests.post(url=upload_url, data=upload_data, files=files_1,headers=headers)
#打印结果
print(upload_resp.json())
封装的类调用代码如下:
import requests
from common.read_config import ReadConfig
class HttpRequest:
def __init__(self,url,method,data=None,token=None,Content_Type=None,files=None):
#拼接url地址
url = ReadConfig().get('api', 'url_pre') + url
# 请求头
headers = "JEECMS-Auth-Token": token,
"Content-Type": Content_Type
# 将data转成json格式
if Content_Type !=None and "application/json" in Content_Type :
data = json.dumps(data)
try:
if method == 'get':
self.resp = requests.get(url=url,params=data,headers=headers)
elif method == 'post':
self.resp = requests.post(url=url, data=data,headers=headers,files=files)
elif method == 'put':
self.resp = requests.put(url=url, data=data, headers=headers)
elif method == 'delete':
self.resp = requests.delete(url=url, data=data, headers=headers)
except Exception as e:
raise e
#获取登录返回的token
def get_token(self):
return self.get_json()['data']['JEECMS-Auth-Token']
#获取响应code码
def get_status_code(self):
return self.resp.status_code
#获取响应正文-json格式
def get_json(self):
return self.resp.json()
#获取响应正文-text格式
def get_text(self):
return self.resp.text
if __name__ == '__main__':
#登录接口
login_url = "/login"
data = "identity":"system","desStr":"EwSSctvjsSzm8sZN2B5mecOcSAGZeGEZ"
#上传接口
upload_url = '/upload/o_upload'
files = "uploadFile":open(r"G:\\photo\\1.jpg", "rb")
data1 = "spaceId":"","addToRes":True
# 先登录
resp = HttpRequest(url=login_url,method='post',data=data)
#获取token
Token = resp.get_token()
#上传接口
resp1 = HttpRequest(url=upload_url,method='post',data=data1,files=files,token=Token)
#打印结果
print(resp1.get_text())
运行以上代码,结果如下:
"code": 200,
"data":
"dimensions": "1920*1080",
"duration": null,
"fileSize": 242,
"fileUrl": "/u/cms/www/202104/29152258msu5.jpg",
"origName": "365zhuti_20120326140308_0",
"resourceId": 25064,
"resourceType": 1,
"videoCover": null
,
"message": "操作成功",
"redirectUrl": "",
"requestUrl": "",
"timestamp": "2021-04-29 15:22:58",
"token": ""
以上是关于python-requests:怎么调通上传接口的主要内容,如果未能解决你的问题,请参考以下文章
前后端联调,调相同接口(参数传参方式请求方式都一样),Netword 和 Postman 中返回数据不一致原因剖析以及解决方案
前后端联调,调相同接口(参数传参方式请求方式都一样),Netword 和 Postman 中返回数据不一致原因剖析以及解决方案