python+pytest接口自动化(5)-requests发送post请求

简介: 在HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递。且协议中并没有规定post请求的请求数据必须使用什么样的编码方式,所以其请求数据可以有不同的编码方式,服务端通过请求头中的 Content-Type 字段来获知请求中的消息主体是何种编码方式,再以对应方式对消息主体进行解析。

简介


在HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递。

且协议中并没有规定post请求的请求数据必须使用什么样的编码方式,所以其请求数据可以有不同的编码方式,服务端通过请求头中的 Content-Type 字段来获知请求中的消息主体是何种编码方式,再以对应方式对消息主体进行解析。

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=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)


参数说明:

  1. url,请求网址
  2. data,字典、元组列表、字节或要发送到指定URL的文件对象,可选(即可填可不填)
  3. json,要发送到指定URL的JSON对象,可选
  4. **kwargs,可以添加其他请求参数,如headers、timeout、cookies等

post接口中常用的编码格式在python脚本中对应的请求参数的格式一般就是 dict (字典) 或 json,如 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,如下图所示:

微信图片_20220425192102.png

那么请求参数编码格式应为dict,代码如下:

import requests
def testerhome_login():
    # data为请求入参
    data = {
        "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=data)
    print(res.text)
    print(res.status_code)
if __name__ == '__main__':
    testerhome_login()

运行结果如下:

微信图片_20220425192107.png

由打印出来的返回内容,我们可以判断该接口请求成功。


发送post请求(请求参数格式为json)


这里我用flask框架写了个简单的模拟接口来演示,接口代码如下:

from flask import Flask, jsonify, request
app = 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 地址,如下:

微信图片_20220425192111.png

这个接口的请求参数格式需要为json,requests.post()请求这个接口代码如下:

import requests
import json
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {
    "username": "lilei",
    "password": "123456"
}
# 这里使用json参数,即json=_data
res = requests.post(url=url, headers=headers, json=_data).text
# 当然还可以使用data参数,但需先将_data转换为json格式,即data=json.dumps(_data)
# json.dumps()将dict格式转换成json格式
res = requests.post(url=url, headers=headers, data=json.dumps(_data)).text
print(res)

运行结果如下:

微信图片_20220425192115.png


总结


post请求因为请求主体编码格式的原因,在使用 requests.post() 时需要根据接口请求头中Content-Type字段,为请求参数选择指定的编码格式,才能发送请求。其实get请求的请求参数也有其对应的编码格式,至于如何确定get、post请求参数的格式,且听下回详解。

相关文章
|
2天前
|
测试技术 API 网络架构
Python的api自动化测试 编写测试用例
【4月更文挑战第18天】使用Python进行API自动化测试,可以结合`requests`库发送HTTP请求和`unittest`(或`pytest`)编写测试用例。以下示例: 1. 安装必要库:`pip install requests unittest` 2. 创建`test_api.py`,导入库,定义基础URL。 3. 创建继承自`unittest.TestCase`的测试类,包含`setUp`和`tearDown`方法。 4. 编写测试用例,如`test_get_users`,检查响应状态码和内容。 5. 运行测试:`python -m unittest test_api.py`
12 2
|
2天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
9 3
|
3天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
21 0
|
3天前
|
测试技术 持续交付 API
Python的UI自动化测试
【4月更文挑战第17天】Python UI自动化测试涉及Selenium(Web)、Appium(移动应用)和PyQt(桌面应用)等框架。基本步骤包括确定测试目标、选择合适框架、安装配置、编写测试脚本、运行调试以及集成到CI/CD流程。注意自动化测试不能完全取代人工测试,应根据需求平衡使用。
8 1
|
14天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
30天前
|
Web App开发 Python
在ModelScope中,你可以使用Python的浏览器自动化库
在ModelScope中,你可以使用Python的浏览器自动化库
17 2
|
1月前
|
存储 BI 数据处理
Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
|
1月前
|
JavaScript 前端开发 Python
【python自动化】Playwright基础教程(三)定位操作
【python自动化】Playwright基础教程(三)定位操作
50 0
|
1月前
|
Python
【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲
【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲
48 0
|
13天前
|
Web App开发 测试技术 网络安全

热门文章

最新文章