Python接口自动化测试之详解post请求

Posted 锦都不二

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python接口自动化测试之详解post请求相关的知识,希望对你有一定的参考价值。

目录

前言

requests.post()参数说明

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

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

总结

写在最后,小小建议


前言

在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,如下图所示:

那么请求参数编码格式应为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()

运行结果如下:

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

发送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 地址,如下:

这个接口的请求参数格式需要为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)

运行结果如下:

总结

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

写在最后,小小建议

最后,当你想踏入这个行业,给两点小小的建议:

(1)你自己需要考虑清楚,你是否真的喜欢这个行业,起码有足够的热情愿意去钻研?因为IT行业的技术发展非常快,非常不断地学习才能保证在这个行业长久的走下去。如果不喜欢学习新技术,即便进入这个行业,也会很快被淘汰。

(2)互联网行业的高薪资并不会无缘无故地给你,加班是不可避免的事情,需要自己想清楚能否接受这种工作强度。

如果你给出的答案是肯定的话,那么不用再犹豫不决,坚定的走下去,在这个行业在这个岗位,付出定能得到对应的回报。

如果下面这些资料用得到的话可以直接拿走:

1、自学开发或者测试必备的完整项目源码与环境

2、测试工作中所有模板(测试计划、测试用例、测试报告等)

3、软件测试经典面试题

4、Python/Java自动化测试实战.pdf

5、Jmeter/postman接口测试全套视频获取

6、Python学习路线图

重点:配套学习资料和视频教学

那么在这里我也精心准备了上述大纲的详细资料包含:电子书,简历模板,各种工作模板,面试宝典,自学项目等。有需要请扣我吧,期待与你们的互动。

以上是关于Python接口自动化测试之详解post请求的主要内容,如果未能解决你的问题,请参考以下文章

Python接口自动化之requests请求封装

Python接口自动化测试之cookiesession应用

python接口自动化(四十一)- 发xml格式参数的post请求(超详解)

python WEB接口自动化测试之requests库详解

接口自动化测试系列之PHPUnit-POST请求接口测试方法

软件测试:Python接口自动化之unittest单元测试