Python接口测试- requests 发送 post 请求
POST 请求用于向服务器发送数据。与 get 相比更安全,同时 post 请求一般会带来数据的更改。
GET 请求不论我们怎么构造,最终都是通过 URL 向服务器传递数据,而 post 通过消息体(报文主体)发送请求。
常见的Content-Type如下:
- application/x-www-form-urlencoded 这是最常见的数据类型,通常表明请求的数据类型是键值对类型,也就是页面 form 表单数据,如: username=nemo&password=123456
- application/json 这意味着请求的数据类型是 Json 格式的数据: { "username":"nemo", "password":"123456"}
- multipart/form-data multipart/form-data 通常用于上传文件。
- application/xml 这表明数据格式为 xml 格式。
前两种是较为常见的数据类型,一般默认情况下都是使用application/x-www-form-urlencoded, 在 requests 的 post 请求中以此为默认的数据类型。
由于之前提供的免费 API 中 post 请求基本上都没法使用,我们还是采用之前在 postman 中使用过的 小项目中的登录为例,来演示如何发送 post 请求。
首先,我们先登录后抓包: 通过抓包可以获取到我们需要的数据:
-
请求 url content-type:application/x-www-form-urlencoded 请求报文数据:username=showdoc&password=123456&v_code=
import requests
url = http://127.0.0.1/showdoc/server/index.php?s=/api/user/login
# 以字典的形式构造数据
data = {
username: showdoc,
password: 123456
}
# 与 get 请求一样,r 为响应对象
r = requests.post(url, data=data)
# 查看响应结果
print(r.json())
由于 requests 默认以 content-type:application/x-www-form-urlencoded 发送 post 请求,所以这里我们不需要特殊处理。
同样,我们可以通过响应对象 r 查看请求和响应中的其他内容:
查看实际的请求数据:
print(r.request.body) ## username=showdoc&password=123456
查看响应中的 cookie:
print(r.cookies) ## <RequestsCookieJar[<Cookie cookie_token=...1b4181689f for 127.0.0.1/>]>
这里的 cookie 是服务端返回的,会用在后续的请求中,如果需要获取:
print(r.cookies.get(cookie_token)) ## 2e7afd2de4dfdab4187b3587f6d532654f854b14f91b4181689f0ddd2fdfa0b9
发送 json 格式的数据
requests 默认使用 form 表单的形式发送数据,那如果服务器要求使用 json 格式呢?
有两种方法可以处理:
- 修改请求头部,传入自定义的 content-type
- 通过参数 json 传递数据
修改请求头部:
import requests
url = http://127.0.0.1/showdoc/server/index.php?s=/api/user/login
# 注意这里必须以json字符串构造数据
data =
{
"username": "showdoc",
"password": "123456"
}
headers = {
content-type: application/json}
# 与 get 请求一样,r 为响应对象
r = requests.post(url, data=data, headers=headers)
# 查看响应结果
print(r.json())
# 查看请求头部
print(r.request.headers)
## 你可以看看 content-type 字段
直接使用 json 参数
import requests
url = http://127.0.0.1/showdoc/server/index.php?s=/api/user/login
# 这里依然以字典的形式构造数据
data = {
username: showdoc,
password: 123456
}
# 与 get 请求一样,r 为响应对象
r = requests.post(url, json=data)
# 查看响应结果
print(r.json())
# 查看请求头部
print(r.request.headers)
## 你可以看看 content-type 字段
使用 json 参数传递,除了会增加 content-type 为 application/json 外,还会将 data 字典自动编码为 json 格式。
而如果我们自定义 content-type 的方式还需要自己将数据构造成 json 格式的数据
所以 ,明显直接使用第二种方式更方便,所以强烈推荐直接用第二种方式。
当然如果涉及到非 form 和 json 格式的数据,就必须要用第一种方式自己构造 content-type 了。
