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


    【文章末尾给大家留下了大量的福利】

    简介

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

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

    post请求参数常用的编码方式如下:

    1. application/x-www-form-urlencoded # form表单格式,非常常见
    2. multipart/form-data # 一般用于上传文件,较为常见
    3. application/json # json字符串格式,非常常见
    4. text/xml # xml格式

    关于post请求参数,后面会有文章专门讲述,这里不做过多的阐述。

    requests.post()参数说明

    使用requests库提供的post方法发送post请求,requests.post() 源码如下:

    1. def post(url, data=None, json=None, **kwargs):
    2. r"""Sends a POST request.
    3. :param url: URL for the new :class:`Request` object.
    4. :param data: (optional) Dictionary, list of tuples, bytes, or file-like
    5. object to send in the body of the :class:`Request`.
    6. :param json: (optional) json data to send in the body of the :class:`Request`.
    7. :param \*\*kwargs: Optional arguments that ``request`` takes.
    8. :return: :class:`Response ` object
    9. :rtype: requests.Response
    10. """
    11. 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,代码如下:

    1. import requests
    2. def testerhome_login():
    3. # data为请求入参
    4. data = {
    5. "user[login]": "账号",
    6. "user[password]": "密码",
    7. "user[remember_me]": 0,
    8. "commit": "登录"
    9. }
    10. headers = {
    11. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53\
    12. 7.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
    13. }
    14. url = "https://testerhome.com/account/sign_in"
    15. # 编码格式为application/x-www-form-urlencoded;charset=UTF-8,所以请求参数为dict,使用data参数
    16. res = requests.post(url=url, headers=headers, data=data)
    17. print(res.text)
    18. print(res.status_code)
    19. if __name__ == '__main__':
    20. testerhome_login()

    运行结果如下:

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

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

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

    1. from flask import Flask, jsonify, request
    2. app = Flask(__name__)
    3. app.config["JSON_AS_ASCII"] = False
    4. @app.route("/login", methods=["POST"])
    5. def login():
    6. username = request.json.get("username").strip()
    7. password = request.json.get("password").strip()
    8. print(username, password)
    9. if username and password:
    10. if username == "lilei" and password == "123456":
    11. return jsonify(
    12. {"code": 1000, "msg": "登录成功!", "token": "sh34ljjl08s32730dj"}
    13. )
    14. elif username == "hanmeimei" and password == "888888":
    15. return jsonify(
    16. {"code": 1000, "msg": "登录成功!", "token": "hjf078977l08ert2323k"}
    17. )
    18. else:
    19. return jsonify(
    20. {"code": 1001, "msg": "账号或密码错误!"}
    21. )
    22. else:
    23. return jsonify(
    24. {"code": 1002, "msg": "账号或密码不能为空!"}
    25. )
    26. if __name__ == '__main__':
    27. app.run()

    注意需要先安装flask框架,然后运行该模块,具体可参考我之前的文章使用Flask开发简单接口,运行后我们可以看到该接口服务的 host 地址,如下:

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

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

    运行结果如下:

    总结

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

      重点:学习资料学习当然离不开资料,这里当然也给你们准备了600G的学习资料

    【需要的可以扫描文章末尾的qq群二维码自助拿走】

    【记得(备注“csdn000”)】

    【或私信000】

    群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

    项目实战:

    大型电商平台:

    全套软件测试自动化测试教学视频

    300G教程资料下载【视频教程+PPT+项目源码】

    全套软件测试自动化测试大厂面经

    python自动化测试++全套模板+性能测试

    听说关注我并三连的铁汁都已经升职加薪暴富了哦!!!!

  • 相关阅读:
    使用Go语言开发一个短链接服务:一、基本原理
    LeetCode-345. 反转字符串中的元音字母-Java-easy
    docker-compose概述与简单编排部署
    【AutoAugment】《AutoAugment:Learning Augmentation Policies from Data》
    23年宁波职教中心CTF竞赛-决赛
    Docker快速部署Mysql
    IP在网络通信中的重要作用
    无管道后门(Backdoor)编写
    SpringCloud Ribbon / Feign
    已解决org.springframework.web.client.ResourceAccessException资源访问异常的正确解决方法,亲测有效!!!
  • 原文地址:https://blog.csdn.net/m0_60054525/article/details/126858520