Python中的接口测试中关于request方法中的json和data参数接收数据的区别

文章目录

  • 前言

  • 一、安装requests库

  • 二、关于json

  • 三、涉及json数据的处理的方法

  • 四、request请求中注意的问题

  • 五、requests的请求方法

  • 总结

前言

Python做接口测试中,request方法里面data关键字接收数据和json关键字接收数据的区别。

一、安装requests库

安装命令:pip install requests

官方文档:https://docs.python-requests.org/zh_CN/latest/

二、关于json

1、json不是一种数据类型,而是一种数据格式。

2、其实返回的json这个结果(对象),在Python中都把它视为字符串(也就是我们收到的返回数据也全部都是字符串)

假设:

如果我们不把返回的这个字符串转化为字典处理,我们怎么做断言?把一个字符串里面的数据提取出来做断言是多么的困难。

这也就是为什么我们要把返回的json格式的字符串转化为字典的原因。

三、涉及json数据的处理的方法

json字符串和字典之间的转换(json库)

序列化(把字典转换成json格式的字符串),简单讲就是将python的字典转换成json格式字符串,以便进行储存或者传输;我们可以这样记:字符串是有顺序的,所以叫做序列化。

语法:

json.dumps(字典)

json.dumps(字典,indent=None),indent是空格显示,加入了数值后,可以按照字典的规范写法

反序列化(把json格式的字符串转换成字典),简单讲就是将json格式字符串转换成python字典,用于对其进行分析和处理。

语法:

json.loads(json串)

举例:

import json

# 序列化成json字符串
d = {'name': 'jod'}
j = json.dumps(d)
print(j)
print(type(j))

# # 反序列化成字典
s=json.loads(j)
print(s)
print(type(s))

运行结果:

注意:

而在requests库中,不用json.loads方法进行反序列化,而是提供了响应对象的json方法,用来对json格式的响应体进行反序列化

 语法:

r = requests.get(url)
r.json()

四、request请求中注意的问题

如果请求的传参的格式是json

第一种方式:使用data数据格式传入参数

我们之前说了在Python中是没有json这个类型的概念,只有跟json长得像的数据类型(字典),所以需要把字典转化为json格式的字符串。

做法:

需要导入json包,使用里面的dumps()函数,把字典进行转换成字符串

import json
dict={'name':'qiuhognji',
    'sex':'男'}
new_json=json.dumps(dict)
response = requests.post(url, headers=headers, params=new_params, data=new_json)
print(reponse.text)

注意:这里的例子其中headers,params参数这些没有用上的可以去掉

举例:

这里的例子的接口会不成功,原因是现在的接口改变了,只能记录之前的。

代码:

import requests
import json

url = "https://testcentralizedsites.mundossp.com/v1mgmt/test"

# 这里的json.dump()是把字典转化为json格式的字符串。
new_json = json.dumps({
     "MH20220424000001": 1,
     "MH20220424000002": 1
 }) 

 headers = {
     'Auth': 'vE6EO5PCIvemJdvk'
 }
 new_params = {"country": "DE",
           "email": "44001",
           "paypal_email": "0000010",
           "order_id": "879"}
 response = requests.request("POST", url, headers=headers, data=new_json)

 print(response.text)

注意:

1、如果是post方法,里面又使用了json格式的字符串,那么就要:用data参数传参,首先要把数据类型是字典转换成为json格式的字符串。

2、使用data参数进行数据传递,data参数内部的处理是:内容类型默认是:x-www-form-urlencoded形式传参(也就是表单的形式传参)

解释:

(1)其实我们使用datas参数进行数据传递,其实含义上跟json格式没有一点儿关系,所以在postman中就直接就使用x-www-form-urlencoded形式传参。

(2)我们只是用data参数作为json格式的传载体(意思也就是本来datas不是用来传递json格式的数据,但是我们现在硬是要塞进去一个长得像json格式的数据,也就是硬塞了一个字典。但是别人真正需要的是json,我塞入字典肯定不合适,那么就要进行数据转化,需要把字典转化为json格式的字符串)

3、如果使用datas参数进行数据传递,如果内容类型选择的不是x-www-form-urlencoded(也就是其他类型),那么就需要在header中加入content-type

第二种方式:使用json格式传入参数

注意:

1、如果使用这个json格式直接传入数据,那么就不需要数据类型的转换

2、json参数传递数据,本来就是专门为了解决json格式的字符串类型的数据,所以使用json参数时,不需要进行转换。json参数的内部处理机制,就会把字典自动转换为json格式的字符串。

3、json参数传递数据默认的content-type是application/json(因此不需要在headers当中指定content-type)

举例:

import requests

url = "https://testcentralizedsites.mundossp.com/v1mgmt/test"

new_json = {
    "MH20220424000001": 1,
    "MH20220424000002": 1
}
headers = {
    'Auth': 'vE6EO5PCIvemJdvk'
}
new_params = {"country": "DE",
              "email": "44001",
              "paypal_email": "0000010",
              "order_id": "879"}
response = requests.request("POST", url, headers=headers, json=new_json)

print(response.text)

运行结果:

 之前有个疑惑点:

我以为这种使用json=xxx去接收数据,里面的数据格式必须写成json的数据格式,像这样:

 以为这个1,是一定不能加双引号的,就必须像postman这样。但是实际结果是:加引号和不加引号都可以成功,原因是:只要你满足了是字典的格式(键值对),在使用json=xxx去接收数据时,都会系统内部自动转化为json。所以能够成功。

五、requests的请求方法:

requests.get(url,param=None) 发起get请求。param是请求参数,是追加在url后面的。字典类型。

requests.post(url,data=None,json=None)发起post请求:

data参数:

任意的content-type都可以用参数传参。

不指明content-type的情况下,默认的content-type是x-www-form-urlencoded,且是字典格式。

如果是其他类型的content-type,需要在headers当中,加上content-type类型。

json参数:

给content-type为application/json格式使用的。

字典类型

不需要在header当中指定content-type

以上两个方法,都是使用的requests.request(mothod,url,**kwargs)

总结

Python中json和data一点小细节总结。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年11月22日
下一篇 2023年11月22日

相关推荐