在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请求及响应结果详解。接下来介绍requests模块中的post请求的使用。
一、源码解析
1
2
3
4
5
6
7
8
9
10
11
12
|
def post(url, data = 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 <Response>` object
:rtype: requests.Response
"""
return request( 'post' , url, data = data, json = json, * * kwargs)
|
post请求参数解析:
url:
请求的url,必填;
data:
选填,请求参数;
json:
选填,请求参数;
kwargs:
选填,可以传入headers、cookies等。
二、data、json区别
小伙伴们看完可能有点懵逼,data和json有啥区别呀,什么时候传入data,什么时候传入json。
举个栗子:
1
2
3
4
|
data = {
"name" : "vivi"
}
print ( type (data))
|
聪明的小伙伴立即抢答了,打印的是字典类型。
那如果想把字典转换为json字符串呢,需要引用json模块。
1
2
3
4
5
6
|
import json
data = {
"name" : "vivi"
}
data = json.dumps(data)
print ( type (data))
|
敲黑板:
- 不管json是str还是dict,如果不指定headers中的content-type,默认为application/json;
- data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式;
- data为str时,如果不指定content-type,默认为application/json。
重点来了,post请求参数到底是传data还是json,这时候我们要看请求头里的content-type类型(具体参照接口文档,没有接口文档的抓包)。
如果请求头中content-type为application/json, 为json形式,post请求使用json参数。
如果请求头中content-type为application/x-www-form-urlencoded,为表单形式,post请求时使用使用data参数。
三、form形式发送post请求
当前接口的请求类型为application/x-www-form-urlencoded。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 导入requests模块
import requests
# 请求url
url = "http://127.0.0.1:8000/user/login"
# 请求参数
payload = {
"mobilephone" : "1530272****" ,
"pwd" : "123456"
}
# form表单形式,参数用data
res = requests.post(url, data = payload)
print (res.text)
|
响应结果为:
{
"status": 1,
"code": "10001",
"data": null,
"msg": "登录成功"
}
四、json形式发送post请求
当前接口的请求类型为application/json。
1
2
3
4
5
6
7
8
9
10
11
|
# 导入requests模块
import requests
# 请求的url地址
url = 'http://127.0.0.1:8000/user/login/'
# 请求头
headers = {"content-type":"application/json"}
# payload 为传入的参数
payload = {"username":"vivi","password":"123456","remember_me":"false"}
# json形式,参数用json
res = requests.post(url,json=payload,headers=headers)
print(res.text)
|
响应结果为:
无响应???
问题来了,如果请求类型为application/json,我偏要传入data参数呢?
先按我们正常思维走一波:
1
2
3
4
5
6
|
import requests
payload = { "username" : "vivi" , "password" : "123456" , "remember_me" : "false" }
header = { "content-type" : "application/json" }
url = 'http://127.0.0.1:8000/user/login/'
res = requests.post(url,data = payload,headers = header)
print (res.text)
|
响应结果:请求错误
{"code":400,"data":[],"message":"Input error"}
请求类型为application/json,如果想用data传参,需要将字典类型数据转换为json字符串
1
2
3
4
5
6
7
8
9
|
import requests
import json
payload = { "username" : "vivi" , "password" : "123456" , "remember_me" : "false" }
header = { "content-type" : "application/json" }
# 字典转换为json串
data = json.dumps(payload)
url = 'http://127.0.0.1:8000/user/login/'
res = requests.post(url,data = data,headers = header)
print (res.text)
|
本文主要讲解post源码,data、json参数应用场景及实战。接口使用的本地服务,如果大家想练手,可以使用公司项目或网上项目自行实战,希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/ZangKang1/article/details/118975454