进阶之路--从0开始学接口测试(3) -- requests

 通过python访问接口

 通过requests库可以使用python访问接口

requests相当于一个客户端,跟浏览器,postman,jmeter相同

导入requests库

import requests

发送一个get请求,参数需要传入url地址

resp = requests.get("http://httpbin.org/get")

获取响应体

print(response.text) #字符串
print(response.content)
print(response.json()) #字典

设置请求方法

发送GET请求

resp = requests.get("http://httpbin.org/get")

发送POST请求

resp = requests.post("http://httpbin.org/get")

发送PUT请求

resp = requests.put("http://httpbin.org/get")

发送DELETE请求

resp = requests.delete("http://httpbin.org/get")

这个接口地址只允许访问GET请求.其他的请求会被禁止,具体的规则是接口文档定义

接口自动化测试的被测函数

自动化测试的场景,需要把请求的参数从文档中获取,然后导入到被测函数(访问接口函数)中

如:(1, ’url’ , ’GET’)

首先运用之前封装过的读取excel函数,把数据以字典的形式读取出来{“case”: “1” , “url”: “http://***” , “method”: “GET”}

然后取出需要的数据(请求方法,url地址) method = “GET”,url=“http://***”

方法1: 利用if控制流

method = "get"
url1 = "http://httpbin.org/get"
url2 = "http://httpbin.org/post"
#方法1
if method == "get":
    resp1 = requests.get(url1)
elif method == "post":
    resp1 = requests.post(url2)

print(resp1)

这种方法,要判断所有的主流方法,容易出现遗漏,或者代码出错

方法2:动态获取requests库里的函数(方法)

fanc_name = getattr(requests,method) #动态requests库里面的函数的名称,fanc_name就会变成相应的函数
resp2 = fanc_name("http://httpbin.org/get")#相当于把requests库里的函数拿出来用
print(resp2)

方法3:直接调用request函数

通过查看源代码可以知道,所有的请求函数,最后都是调用request函数

 而在request函数中,直接把请求方法作为参数,这样更方便我们使用

method = "get"
url1 = "http://httpbin.org/get"
resp3 = requests.request(method,url1)
print(resp3)

方法3比较适合当以后接口测试的被测函数

调用接口函数的时候,最好使用关键字参数传入

设置请求头(字典存储)

 在postman中,GET和POST请求支持在请求头中传入参数,但是要服务端规定能传递哪些参数,这样才会有效,详细参考接口文档

在request中设置请求头,查看源码可以知道,除了请求方法和url地址之外,其他参数都是用关键字不定长参数传入,也就是使用字典传入,所以会通过headers关键字参数把请求头的数据保存到字典,然后发送给服务器

import requests
url = "http://httpbin.org/get"
method = "GET"
#添加请求头,使用字典存储自定义的请求头
headers = {"name": "conlin","hobby": "game","user-agent": "chrome"}
#GET
resp = requests.request(method=method,url=url,headers = headers)
print(resp.text)

 我们可以通过请求头修改和新增url参数,修改方式跟字典一样,如果已经有的数据,将会被修改

通过请求头修改了客户端代理的值 

设置请求参数(字典存储)

url参数(query string查询字符串)

GET方法通过postman输入url参数,可以在url地址里通过?格式或者在params里传入

 在params中传入参数,自动会在url地址上生成,跟在url地址上输入参数是一样的

在requests中传入参数

--通过请求头headers传入

 参照设置请求头

--通过传入url参数

参数数据保存在字典中,然后用关键字参数params传入

import requests
url = "http://httpbin.org/get"
method = "GET"

#添加url参数,通过params关键字参数
params = {"username": "berry","pass": "112312"}

#GET
resp = requests.request(method=method,url=url,params = params)

--通过请求体传入(不适合GET方法)

POST方法除了可以在url地址,headers传入参数,还可以通过请求体(body)传入参数,参数的类型可以有form-data,json等格式,具体传参的规则参考接口文档,一般在body中传入

-Form-data传入参数

url2= "http://httpbin.org/post"
method2 = "POST"

#form-data,存在字典中,然后通过data关键字参数传递
data = {"username": "berry","pass": "112312"}
#json,跟form相同,只要把关键字参数改成json

#post
resp2 = requests.request(method=method2,url=url2,data = data)
print(resp2.json())

-json传入参数

把参数保存到字典,然后通过关键字json传入,然后python会自动把字典的数据按json的格式传到服务器

url2= "http://httpbin.org/post"
method2 = "POST"

#form-data,存在字典中,然后通过data关键字参数传递
data = {"username": "berry","pass": "112312"}
#json,跟form相同,只要把关键字参数改成json

#post
resp2 = requests.request(method=method2,url=url2,json = data)
print(resp2.json())

访问接口时,同时支持form-data,query srting,header同时传参,因为它们是不同的机制,但是form-data和json不能同时使用,因为这两个是请求体传参的格式,是同一个机制

json拓展:

json是具有特定标识,特点格式字符串,所以传入json参数的时候一定要按照它的格式,格式相当于python中的字典,但是json并不是一个字典

在访问接口,得到响应体时,通过json()方法把text的字符串转变成字典形式,而text也是一个json格式,因为它符合json格式的写法,通过json()方法,我们可以直接拿取token信息

 响应体格式

import requests
url = "http://httpbin.org/get"

resp = requests.request("GET",url)

print(resp.text)#str
print(resp.content)#bytes
print(resp.json())#dict

Text是一个字符串,也是一个json格式

Content是一个二进制格式

json()是一个函数,代表把返回的请求体text格式转换成字典,通过源码可以知道,这个函数返回的时候也是调用了json模块里的转换方法json.load()

 text content json(),可以进行格式转换

字符串(text)和二进制(content)的互相转换

Text-->content,编码,使用encode()函数

new_content = resp.text.encode()
print(new_content)

 Content-->text,解码,使用decode()函数

# content==>解码 text
new_text = resp.content.decode()
print(new_text)

json转换成字典

 因为text是一种特定格式,是一个json格式 json里一定要双引号{"key": "value","key1": "value1","key3": true,"key4": null,"key5": [1,2,3]}

访问json.cn确认字符串是否为json

json是具有特定标识,特点格式字符串,所以为了方便查询数据,可以转换成字典,但是不能用eval函数,eval函数本质,转换成可以执行的python代码,项目阶段不要轻易使用

要想安全地把json转换成字典,要引入序列化和反序列化

上面我们知道,在访问接口的时候,得到响应体是一个json格式,能用requests里json()这个函数直接转换成字典,这个函数其实就是调用了json模块里的load方法.

如果不是从响应体得到的json格式,比如从excel表格导入,我们需要导入json模块进行转换

import json

反序列化:json数据转换python的字典,通用的数据格式转换成编程语言的数据类型

json_data = '{"key": "value","key1": "value1","key3": true,"key4": null,"key5": [1,2,3]}'
import json
#反序列化,json-->字典
dict_data = json.loads(json_data)
print(dict_data)#字典

得到的是一个字典 

序列化:字典转换成json  编程语言的数据类型转换成通用的数据格式(文本,二进制数据,字符串)

#序列化 字典-->json
new_data = json.dumps(dict_data)
print(new_data) #字符串

得到的是一个字符串

json拓展:

json的值,有特定的规则,python的True开头大写,json要小写true, python的None,到了json是null

python的列表到json叫数组

 Token的处理

1.访问登录接口,得到登录接口返回的token值,包含teken type,bearer
2,再访问其他接口时,带上token值
3,传输时token存放的位置,是由开发决定
4,一般标准的规范,是放在Authorization的请求头中,通常会设置token前缀,Bearer,JWT

import requests
url = 'http://api.lemonban.com:8766/futureloan/member/login'
headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
json_data = {"mobile_phone": "13711112222","pwd": "12345678"}
resp = requests.request("POST",url,headers=headers,json=json_data)
#得到token
json_resp = resp.json()
print(json_resp["data"]["token_info"]["token"])

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值