这篇教程Python接口自动化之浅析requests模块post请求写得很实用,希望能帮到您。 在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请求及响应结果详解。接下来介绍requests模块中的post请求的使用。 一、源码解析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。 举个栗子: data = { "name":"vivi"}print(type(data)) 聪明的小伙伴立即抢答了,打印的是字典类型。 那如果想把字典转换为json字符串呢,需要引用json模块。 import jsondata = { "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。 # 导入requests模块import requests# 请求urlurl = "http://127.0.0.1:8000/user/login"# 请求参数payload = { "mobilephone":"1530272****", "pwd":"123456"}# form表单形式,参数用datares = requests.post(url, data=payload)print(res.text) 响应结果为: { "status": 1, "code": "10001", "data": null, "msg": "登录成功" }
四、json形式发送post请求当前接口的请求类型为application/json。 # 导入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形式,参数用jsonres = requests.post(url,json=payload,headers=headers)print(res.text) 响应结果为: 无响应??? 问题来了,如果请求类型为application/json,我偏要传入data参数呢? 先按我们正常思维走一波: import requestspayload = {"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字符串 import requestsimport jsonpayload = {"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参数应用场景及实战。接口使用的本地服务,如果大家想练手,可以使用公司项目或网上项目自行实战。 本文主要讲解post源码,data、json参数应用场景及实战。接口使用的本地服务,如果大家想练手,可以使用公司项目或网上项目自行实战,希望大家以后多多支持51zixue.net! Python接口自动化浅析Token应用原理 Python接口自动化之cookie、session应用详解 |