Python接口自动化测试之详解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 <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请求参数的格式,且听下回详解。 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux最佳入门(笔记)

1、内核的主要功能 2、常用命令 3、通配符&#xff1a;这个在一些启动文件中很常见 4、输入/输出重定向 意思就是将结果输出到别的地方&#xff0c;例如&#xff1a;ls标准会输出文件&#xff0c;默认是输出到屏幕&#xff0c;但是用>dir后&#xff0c;是将结果输出到dir文…

Guitar Pro8许可证2024最新免费

作为一位吉他爱好者推荐官&#xff0c;我非常荣幸地向大家介绍一款备受赞誉的吉他工具——Guitar Pro8。这款软件是吉他爱好者们的必备之选&#xff0c;它以其卓越的功能和优势&#xff0c;全面覆盖学习演奏和绘谱创作的需求&#xff0c;帮助吉他爱好者们更好地提升自己的技能。…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码&#xff0c;1 代表成功; 0 代表失…

【框架】跨端开发框架介绍(Windows/MacOS/Linux/Andriod/iOS/H5/小程序)

1. 跨端框架介绍 跨端框架适用场景说明移动端 uniapp Andriod、iOS、H5、小程序、快应用 uniapp是一个使用Vue开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;选择相应目标进行编译&#xff0c;编译后分别部署到网站、APP、小程序多个平台 笔者&#x…

[小程序开发] 构造页面

一、Component方法 Component方法用于创建自定义组件&#xff0c;小程序页面也可以使用Component方法进行创建&#xff0c;从而实现复杂的页面逻辑开发。 使用Component方法构造页面&#xff0c;可以实现更加复杂的页面逻辑开发。 二、注意事项 1、要求.json文件中必须包含usi…

【编程项目开源】拼图游戏(鸿蒙版)

目标 做个拼图游戏 效果 开发工具 下载DevEco Studio 工程截图 开源地址 https://gitee.com/lblbc/puzzle/tree/master/puzzle_hongmeng_arkUI 关于 厦门大学计算机专业|华为八年高级工程师 专注《零基础学编程系列》 http://lblbc.cn/blog 包含&#xff1a;Java | 安卓…

强化学习------DDPG算法(附pytorch代码)

目录 一、前言二、基本原理2.1、经验回放2.2、更新过程2.2.1、Critic网络更新过程2.2.2、Actor网络更新过程2.2.3、 目标网络的更新 2.3、噪音探索 三、算法代码实现四、训练示例4.1、实现效果 一、前言 Deep Deterministic Policy Gradient (DDPG)算法是DeepMind团队提出的一…

LeetCode每日一题——移除元素

移除元素OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 题目给定要求只能使用O(1)的额外空间并且原地修改输入数组&#xff0c;然后返回移除后的数组行长度。那 么我们就可以确我没有办法建立临时的数组存放我…

AcWing 790:数的三次方根 ← 浮点数二分

【题目来源】https://www.acwing.com/problem/content/792/【题目描述】 给定一个浮点数 n&#xff0c;求它的三次方根。【输入格式】 共一行&#xff0c;包含一个浮点数 n。【输出格式】 共一行&#xff0c;包含一个浮点数&#xff0c;表示问题的解。 注意&#xff0c;结果保留…

【Stable Diffusion】入门-01:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

面试-简单算法题

简单算法&#xff1a; 1.反转字符串 编写一个函数&#xff0c;将输入的字符串反转。 function reverseString(str) {return str.split().reverse().join(); }str.split(‘’)&#xff1a;使用 split(‘’) 方法将字符串 str 拆分成字符数组&#xff0c;每个字符都成为数组中…

电路方案分析(十八)四开关buck-boost双向同步DC/DC变换器方案

tip是&#xff1a;资料来自网络&#xff0c;仅供学习交流使用&#xff01; 1.概述 4开关降压升压双向DC-DC电源转换器在很多应用中都有使用。作为一个同步降压或同步升压转换器&#xff0c;其中只有两个开关切换&#xff0c;开关损耗减少到一半。只有当直流母线和电池电压彼此…

人形机器人进展:IEEE Robotics出版双臂通用协同机械手操作架构

文章目录 1. Main2. My ThoughtsReference彩蛋a. OpenAI 投资: 人形机器人公司 Figure AIb. 人工智能软件工程师 Devin 上线 1. Main 图1 人居环境下的人形双臂机器人系统 通用人形机器人 作为近年来机器人与AI交叉领域的研究热点和技术竞争高地&#xff0c;因其具备在 非结构化…

深度强化学习(六)(改进价值学习)

深度强化学习(六)(改进价值学习) 一.经验回放 把智能体与环境交互的记录(即经验)储存到 一个数组里&#xff0c;事后反复利用这些经验训练智能体。这个数组被称为经验回放数组&#xff08;replay buffer&#xff09;。 具体来说, 把智能体的轨迹划分成 ( s t , a t , r t ,…

软件工程(Software Engineering)

一、软件工程概述 1.软件生存周期 软件&#xff1a; 包含程序、数据及相关文档 软件工程&#xff1a; 涉及到软件开发、维护、管理等多方面的原理、工具与环境。最终的目的是开发高质量的软件。 目的&#xff1a; 提高软件生产率、提高软件质量、降低软件成本。 文档的作用&…

一瓶5.86万,听花酒什么来头?

听花酒&#xff0c;到底什么来头&#xff1f; 宣称有提升免疫力、改善睡眠、保障男性功能、调节生理紊乱、抗衰老等功效的听花酒&#xff0c;被315晚会曝光了。 相关话题词随即冲上了热搜。之后&#xff0c;售价最高达58600元的听花酒被京东、拼多多、淘宝等电商平台火速下架…

01、CMD与Hello world

一、CMD与Hello World 文章目录 一、CMD与Hello World1.什么是cmd2.打开cmd3.常用命令4.环境变量5.JDK的安装6.JDK环境变量的配置7.javac 与 java命令8.HelloWorld9.JRE与JDKJDK&#xff08;Java Development kit&#xff09;:Java 开发工具包JRE &#xff08;Java Runtime Env…

HashMap的七种遍历方式

HashMap我整理了七种遍历方式&#xff1a; Iterator entrySet Iterator keySet ForEach entrySet ForEach keySet lambda stream entrySet stream 多线程 entrySet 下面看代码&#xff1a; public static void main(String[] args) {HashMap<String, String> map…

Stable Diffusion 阿里云搭建FC实现文生图模型

AI的创造力真的很奇妙。 提示词&#xff1a;杰作&#xff0c;最佳品质&#xff0c;非常详细&#xff0c;七龙珠&#xff0c;孙悟空&#xff0c;西游记&#xff0c;仙境&#xff0c;动态角度&#xff0c;火焰山&#xff0c;小岛&#xff0c;站立&#xff0c;携带魔兽&#xff0…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2(包括完整代码+添加步骤+网络结构图)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构&#xff0c;用于图像分类和目标检测任务。它是ShuffleNet的改进版本&#xff0c;旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本&#xff0c;在保持模型轻量化的同时&am…