Python接口测试 requests.post方法中data与json参数区别

news2024/10/7 10:18:19

引言

requests.post主要参数是data与json,这两者使用是有区别的,下面我详情的介绍一下使用方法。

Requests参数

1. 先可以看一下requests的源码:

1

2

3

4

5

6

7

8

9

10

11

12

13

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请求报文中既可以传data,也可以传json。并且data与json,既可以是str类型,也可以是dict类型。

2. json与data参数规则:

一、JSON

1.使用json参数,不管报文是str类型,还是dict类型,如果不指定headers中content-type的类型,默认是:application/json。

二、DATA

1.使用data参数,报文是dict类型,如果不指定headers中content-type的类型,默认application/x-www-form-urlencoded,相当于普通form表单提交的形式,会将表单内的数据转换成键值对,此时数据可以从request.POST里面获取,而request.body的内容则为a=1&b=2的这种键值对形式。

注意:即使指定content-type=application/json,request.body的值也是类似于a=1&b=2,所以并不能用json.loads(request.body.decode())得到想要的值。

2.使用data参数,报文是str类型,如果不指定headers中content-type的类型,默认application/json。

综上所述,两种参数的使用情况:

用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为'{"a": 1, "b": 2}'的这种形式

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

实例解析

知道了上面所讲的理论,需要通过实例来验证一下。

以我django项目开发的web接口为例:

url.py文件

1

2

3

4

5

6

7

8

9

10

from django.contrib import admin

from django.urls import path,include

from django_web.views import views

from django.conf.urls import url

urlpatterns = [

    path('admin/', admin.site.urls),

    #首页

    path('index/',views.test_dj), #登陆页面

view.py文件

1

2

3

4

5

6

7

8

9

def test_dj(request):

    print(request.body,111)

    print(request.headers)

  

"""

    当post请求的请求体以data为参数,发送过来的数据格式为:b'username=test&password=123'

    当post请求的请求体以json为参数,发送过来的数据格式为:b'{"username": "test", "password": "123"}'

"""

return render(request, 'index.html')

exp1:

test.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import requests

headers = {'content-type':'application/json'}

data = {

    "username""test",

    "password""123"

}

print(type(data)) #dict

r1 = requests.post(url="http://127.0.0.1:8000/index/",data=data)

print(r1.text)

返回的报文:

1

2

b'username=test&password=123' 111

{'Content-Length''26''Content-Type''application/x-www-form-urlencoded''Host''127.0.0.1:8000''User-Agent''python-requests/2.22.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}

exp1案例:证实了第二条规则:使用data参数,报文是dict类型,不指定content-type,默认是:application/x-www-form-urlencoded,请求数据格式是:key1=value1&key2=value2键值对形式。

exp2:

test.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import requests

headers = {'content-type':'application/json'}

data = {

    "username""test",

    "password""123"

}

print(type(data)) #dict

r1 = requests.post(url="http://127.0.0.1:8000/index/",json=data)

print(r1.text)

将参数data换成json请求,返回的报文:

1

2

b'{"username": "test", "password": "123"}' 111

{'Content-Length''39''Content-Type''application/json''Host''127.0.0.1:8000''User-Agent''python-requests/2.22.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}

exp2案例:证实了第一条规则:使用json参数,报文是dict类型,如果不指定headers中content-type的类型,默认是:application/json,请求数据格式是:dict形式。

exp3:

test.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import requests,json

headers = {'content-type':'application/json'}

data = {

    "username""test",

    "password""123"

}

print(type(data)) #dict

# 方法1

r1 = requests.post(url="http://127.0.0.1:8000/index/",data=json.dumps(data))

# 方法2

r2 = requests.post(url="http://127.0.0.1:8000/index/",json=json.dumps(data))

print(r1.text)

print(r2.request)

查看返回报文:

1

2

3

4

5

b'{"username": "test", "password": "123"}' 111

{'Content-Length''39''Content-Type''text/plain''Host''127.0.0.1:8000''User-Agent''python-requests/2.22.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}

b'"{\\"username\\": \\"test\\", \\"password\\": \\"123\\"}"' 111

{'Content-Length''49''Content-Type''application/json''Host''127.0.0.1:8000''User-Agent''python-requests/2.22.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}

[01/Mar/2020 14:02:11] "POST /index/ HTTP/1.1" 200 1890

  

exp3案例

证实了第一条规则:使用json参数,报文是str类型,如果不指定headers中content-type的类型,默认是:application/json,请求数据格式是:dict形式。也就是test.py中的方法2.

还证实了第三条规则:使用data参数,报文是str类型,如果不指定headers中content-type的类型,默认application/json。其实方法1和方法2是等价的。报文是json字符串数据,分别以data与json两种参数形式发送请求,得到的请求体数据格式是一样。

注意:方法1返回的数据类型是:'Content-Type': 'text/plain',表示无格式,但规则说是默认application/json,是否有冲突? 其实不然,服务器并没有强制指定接收数据的格式类型,所以这种情况下也不会报错。

总结

总而言之,记住这句话:用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为'{"a": 1, "b": 2}'的这种形式。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

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

在这里插入图片描述

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

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

相关文章

STM32CUBEMX_DMA串口空闲中断接收+接收发送缓冲区

STM32CUBEMX_DMA串口空闲中断接收接收发送缓冲区 前言&#xff1a; 我了解的串口接收指令的方式有&#xff1a;在这里插入图片描述 1、接收数据中断特定帧尾 2、接收数据中断空闲中断 3、DMA接收空闲中断 我最推荐第三种&#xff0c;尤其是数据量比较大且频繁的时候 串口配置 …

Vmware Linux虚拟机安装教程(Centos版)

文章目录 1.Vmware-workstation安装软件2.双击下载的安装包开始安装3.打开VMware-workstation&#xff0c;输入密钥4.Centos7.6安装软件5.新建虚拟机6.为虚拟机配置映像文件7.开启虚拟机&#xff0c;配置环境7.1 Install Centos 77.2 选择简体中文字体7.3 软件选择7.4 安装位置…

LeetCode【20】 有效的括号

题型&#xff1a;栈 题目&#xff1a; 代码&#xff1a; public boolean isValidReview(String s) {//&#xff08;1&#xff09;从s的i0位置一次开始压栈&#xff0c;遇到左括号压栈&#xff0c;不管是大中小三种&#xff0c;左括号&#xff0c;压//&#xff08;2&#xf…

基于 EventBridge 轻松搭建消息集成应用

作者&#xff1a;昶风 前言 本篇文章主要介绍基于阿里云 EventBridge 的消息集成能力&#xff0c;结合目前消息产品的需求热点&#xff0c;从能力范围到场景实战&#xff0c;对 EventBridge 的消息集成解决方案进行了概要的介绍。 从消息现状谈起 消息队列作为应用解耦&…

Redis 基础—Redis Desktop Manager(Redis可视化工具)安装及使用教程

Redis Desktop Manager 是一个可视化的 Redis 数据库管理工具&#xff0c;可以方便地查看和操作 Redis 数据库。使用 Redis Desktop Manager 可以大大提高 Redis 数据库的管理效率。 RDM的安装和配置 首先&#xff0c;您需要下载和安装Redis Desktop Manager。 安装完成后&am…

高校教务系统密码加密逻辑及JS逆向——皖南医学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

提升企业服务行业管理效率的关键策略与方法」

To B 服务&#xff0c;也即企业服务近年来大家关注的重点&#xff0c;企业服务是指为企业客户提供运营管理相关的工具与系统解决方案等服务&#xff0c;通过专业化的服务可以实现降本增效&#xff0c;提高企业的经营效率。 近年来&#xff0c;人口红利的消失促使企业服务需求快…

DC电源模块低温是否影响转换效率

BOSHIDA DC电源模块低温是否影响转换效率 DC电源模块是一种常用的电源转换装置&#xff0c;其主要作用是将输入的电源信号变换成需要的输出电源信号。在实际应用中&#xff0c;DC电源模块的性能会受到多种因素的影响&#xff0c;其中低温也是一个重要的影响因素。本文将从转换…

kettle应用-从数据库抽取数据到excel

本文介绍使用kettle从postgresql数据库中抽取数据到excel中。 首先&#xff0c;启动kettle 如果kettle部署在windows系统&#xff0c;双击运行spoon.bat或者在命令行运行spoon.bat 如果kettle部署在linux系统&#xff0c;需要执行如下命令启动 chmod x spoon.sh nohup ./sp…

c++设计模式之单例设计模式

&#x1f482; 个人主页:[pp不会算法v](https://blog.csdn.net/weixin_73548574?spm1011.2415.3001.5343) &#x1f91f; 版权: 本文由【pp不会算法^v^】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦…

以命令行形式执行Postman脚本(使用Newman)

目录 一、背景 二、Newman的安装 三、脚本准备 四、Newman的执行 五、生成报告 一、背景 ​ Postman的操作离不开客户端。但是在一些情况下可能无法使用客户端去进行脚本执行。比如在服务端进行接口测试。由此我们引入了Newman。Newman基于Node.js开发&#xff0c;它使您可…

【MySQL】表的查询与连接

文章目录 预备工作一、表的基本查询1、简单基本查询2、分组聚合统计3、基本查询练习 二、表的复合查询1、多表查询2、子查询2.1 **单行子查询**2.2 **多行子查询**2.3 **多列子查询**2.4 在from子句中使用子查询 3、合并查询 三、表的连接1、自连接2、内连接3、外连接 预备工作…

【C++】关键字 命名空间 输入输出 缺省函数

一&#xff0c;C关键字 C 总计 63 个关键字&#xff0c;C语言 32 个关键字 直接上图&#xff1a; asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatche…

Win11更新后瘦身C盘的两个小技巧

每当windows更新完后&#xff0c;就很容易出现一个现象&#xff0c;那便是C盘存储变红了。 这个时候&#xff0c;就会有方法指出&#xff1a;把C盘中的系统更新文件清理掉吧&#xff0c;这样C盘就又能瘦回去了&#xff01; 然而&#xff0c;当你兴冲冲地按照网上的教程点击C…

OPTEE之KASAN地址消毒动态代码分析

安全之安全(security)博客目录导读 目录 一、KASAN简介 二、OPTEE_OS中KASAN配置选项 三、OPTEE_OS中KASAN配置选项打开 一、KASAN简介 内核地址消毒器(KASAN)是Linux内核的快速内存损坏检测器&#xff0c;KASAN检测slab、page_alloc、vmalloc、stack和全局内存中的越界、u…

Yarn基础入门

文章目录 一、Yarn资源调度器1、架构2、Yarn工作机制3、HDFS、YARN、MR关系4、作业提交之HDFS&MapReduce 二、Yarn调度器和调度算法1、先进先出调度器&#xff08;FIFO&#xff09;2、容量调度器&#xff08;Capacity Scheduler&#xff09;3、公平调度器&#xff08;Fair …

信钰证券:首板第二天买入技巧?

股票上市第一天&#xff0c;也就是所谓的“首板”&#xff0c;一般会引起商场的高度注重。那么关于投资者而言&#xff0c;如安在接下来的第二天进行买入是个十分要害的决议计划。本文将从多个角度剖析首板第二天买入技巧&#xff0c;供读者参阅。 首先&#xff0c;多数人或许…

京东数据平台:2023年服饰行业销售数据分析

最近看到有些消费机构分析&#xff0c;不少知名的运动品牌都把“主战场”放到了冲锋衣&#xff0c;那么羽绒服市场就比较危险了。但其实羽绒服市场也有机会点可寻。 先来说冲锋衣。的确&#xff0c;从今年的销售数据以及增长情况&#xff0c;冲锋衣的确会是今年冬天的大热门品…

领跑新周期!高通8295/8255上车,这家厂商已经整装待发

围绕高通下一代8295/8255平台&#xff0c;一场激烈的市场争夺战已经打响。 目前&#xff0c;各大域控制器厂商、汽车软件厂商围绕高通8295/8255平台&#xff0c;已经推出了诸多的解决方案&#xff0c;以抢占下一代高性能SoC带来的全新市场红利。《高工智能汽车》了解到&#x…

炮轰特斯拉「无图」,一家老牌图商的反击

‍作者|张祥威 编辑|德新 为实现城市NOA&#xff0c;车厂近年将重感知、轻地图奉为圭臬&#xff0c;一些玩家甚至提出「无图」概念&#xff0c;这让高精度地图供应商倍感压力。 四维图新CEO程鹏是坚定的反「无图」论者&#xff0c;他不太理解喊无图的目的是什么。后来和各家交…