python+pytest接口自动化(5)-发送post请求
简介
在HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递。
且协议中并没有规定post请求的请求数据必须使用什么样的编码方式,所以其请求数据可以有不同的编码方式,服务端通过请求头中的Content-Type
字段来获知请求中的消息主体是何种编码方式,再以对应方式对消息主体进行解析。
【python+pytest接口自动化(5)-发送post请求】post请求参数常用的编码方式如下:
application/x-www-form-urlencoded# form表单格式,非常常见
multipart/form-data# 一般用于上传文件,较为常见
application/json# json字符串格式,非常常见
text/xml# xml格式
关于post请求参数,后面会有文章专门讲述,这里不做过多的阐述。
requests.post()参数说明
使用requests库提供的post方法发送post请求,
requests.post()
源码如下:def post(url, data=https://www.it610.com/article/None, json=None, **kwargs):
r"""Sends a POST request.:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response ` object
:rtype: requests.Response
"""return request('post', url, data=https://www.it610.com/article/data, json=json, **kwargs)
参数说明:
- url,请求网址
- data,字典、元组列表、字节或要发送到指定URL的文件对象,可选(即可填可不填)
- json,要发送到指定URL的JSON对象,可选
- **kwargs,可以添加其他请求参数,如headers、timeout、cookies等
application/x-www-form-urlencoded
格式在python中对应为dict,application/json
在python中对应为json。因此,接下来分别这种编码格式进行举例。
发送post请求(请求参数格式为dict)
我们以请求TesterHome网的登录接口为例,发送请求参数格式为dict的请求。
请求头中content-type为
application/x-www-form-urlencoded;
charset=UTF-8
,如下图所示:文章图片
那么请求参数编码格式应为dict,代码如下:
import requestsdef testerhome_login():
# data为请求入参
data = https://www.it610.com/article/{"user[login]": "账号",
"user[password]": "密码",
"user[remember_me]": 0,
"commit": "登录"
}
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0;
Win64;
x64) AppleWebKit/53\
7.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
}
url = "https://testerhome.com/account/sign_in"# 编码格式为application/x-www-form-urlencoded;
charset=UTF-8,所以请求参数为dict,使用data参数
res = requests.post(url=url, headers=headers, data=https://www.it610.com/article/data)
print(res.text)
print(res.status_code)if __name__ =='__main__':
testerhome_login()
运行结果如下:
文章图片
由打印出来的返回内容,我们可以判断该接口请求成功。
发送post请求(请求参数格式为json)
这里我用flask框架写了个简单的模拟接口来演示,接口代码如下:
from flask import Flask, jsonify, requestapp = Flask(__name__)
app.config["JSON_AS_ASCII"] = False@app.route("/login", methods=["POST"])
def login():
username = request.json.get("username").strip()
password = request.json.get("password").strip()
print(username, password)
if username and password:
if username == "lilei" and password == "123456":
return jsonify(
{"code": 1000, "msg": "登录成功!", "token": "sh34ljjl08s32730dj"}
)
elif username == "hanmeimei" and password == "888888":
return jsonify(
{"code": 1000, "msg": "登录成功!", "token": "hjf078977l08ert2323k"}
)
else:
return jsonify(
{"code": 1001, "msg": "账号或密码错误!"}
)
else:
return jsonify(
{"code": 1002, "msg": "账号或密码不能为空!"}
)if __name__ == '__main__':
app.run()
注意需要先安装flask框架,然后运行该模块,具体可参考我之前的文章使用Flask开发简单接口,运行后我们可以看到该接口服务的 host 地址,如下:
文章图片
这个接口的请求参数格式需要为
json
,requests.post()
请求这个接口代码如下:import requests
import jsonheaders = {"Content-Type": "application/json;
charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = https://www.it610.com/article/{"username": "lilei",
"password": "123456"
}# 这里使用json参数,即json=_data
res = requests.post(url=url, headers=headers, json=_data).text
# 当然还可以使用data参数,但需先将_data转换为json格式,即data=https://www.it610.com/article/json.dumps(_data)
# json.dumps()将dict格式转换成json格式
res = requests.post(url=url, headers=headers, data=json.dumps(_data)).text
print(res)
运行结果如下:
文章图片
总结
post请求因为请求主体编码格式的原因,在使用
requests.post()
时需要根据接口请求头中Content-Type字段,为请求参数选择指定的编码格式,才能发送请求。其实get请求的请求参数也有其对应的编码格式,至于如何确定get、post请求参数的格式,且听下回详解。推荐阅读
- Appium自动化测试中获取Toast信息操作
- @Autowired|@Autowired 自动注入接口失败的原因及解决
- python自动化测试|自动化测试——Selenium+Python之下拉菜单的定位
- 自动化测试|selenium自动化测试——元素定位篇(下)
- 测试用例|自动化测试——unittest框架
- 单元测试|自动化测试——selenium(环境部署和元素定位篇)
- 测试|自动化测试——selenium初识
- 程序员|自动化测试工具——selenium 用前须知
- Python开发游戏自动化后台脚本的实现
- feignclient|feignclient https 接口调用报证书错误的解决方案