Python接口自动化-requests模块之post请求

  • Post author:
  • Post category:python


——————·今天距2021年262天·——————

这是ITester软件测试小栈第111次推文

在上一篇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 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。

# 导入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。

# 导入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)

响应结果为:

{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY1OTUyOTEsImVtYWlsIjoidml2aUBxcS5jb20ifQ.1RGrO6hSWHi9RDXjYuqY0UCPKMmQvaybpHvYqC0dCis",
  "user_id": 1,
  "username": "vivi"
}

问题来了,如果请求类型为application/json,我偏要传入data参数呢?

先按我们正常思维走一波:

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字符串。

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参数应用场景及实战。接口使用的本地服务,如果大家想练手,可以使用公司项目或网上项目自行实战。

下一篇介绍:接口自动化之 cookie、session原理及应用。

原创不易,喜欢的小伙伴,留言、点赞、转发三连。

以上

That‘s all

更多系列文章

敬请期待

ITester软件测试小栈

往期内容宠幸


1.Selenium系列文章汇总



2.Fiddler基本使用



3.Fiddler抓包介绍




4.


Fiddler请求过滤



5.


Fiddler设置断点(一)



6.


Fiddler跨域调试及Django跨域处理



7.Python接口自动化-接口基础(一)



8.Python接口自动化-接口基础(二)



9.Postman系列之安装及简介



10.Postman系列之发送不同HTTP类型请求

快来星标 置顶 关注我

后台

回复资源取干货

回复2020与我共同成长

想要获取相关资料和软件 ?

测试交流Q群:727998947

在看的话,点亮一下小花花



版权声明:本文为weixin_42485712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。