requests模块API封装

1.设置请求方法

import requests

# GET
resp = requests.get('http://124.70.16.3:8009/login')
print(resp)
# POST
resp = requests.post('http://124.70.16.3:8009/login')
print(resp)
# PUT
resp = requests.put('http://124.70.16.3:8009/login')
print(resp)
# DELETE
resp = requests.delete('http://124.70.16.3:8009/login')
print(resp)

运行结果:

<Response [200]>
<Response [405]>
<Response [405]>
<Response [405]>

因为访问的接口只允许GET请求,POST,PUT,DELETE被禁止,所以得到405结果,请求方法是什么要找开发或接口文档

可以查看requests源码来支持哪种请求,按CTRL键点击get可以查看

通用的访问接口方法:

import requests

# 自动化测试
(1, 'url', 'get', '...')
method = 'get'
# 通用方法一:
if method == 'get':
    requests.get('http://124.70.16.3:8009/login')
elif method == 'post':
    requests.post('http://124.70.16.3:8009/login')
...
# 通用方法二:
func_name = getattr(requests, method)
resp = func_name('http://124.70.16.3:8009/login')
print(f'方法二:{resp}')
# 通用方法三:
resp = requests.request(method,'http://124.70.16.3:8009/login')
print(f'方法三:{resp}')

运行结果:

方法二:<Response [200]>
方法三:<Response [200]>

 由此可见:方法三比较简单,requests下有个request方法

2.设置请求头

import requests

url = 'http://www.httpbin.org/get'
# 添加请求头
headers = {'name': 'li', 'pass': 'jiao'}
resp = requests.request('get', url=url, headers=headers)  # 尽量使用关键字参数,不容易出错
print(resp.text)

运行结果:

修改headers:

headers = {'name': 'li', 'pass': '123456','user-agent':'chrom'}

总结:

自定义请求头,直接将请求头保存到字典中,然后通过headers关键字参数传递

请求头里有的字段,是修改,没有的字段是新增 

请求头的参数默认首字母大写

在postman中进行设置:

 3.设置请求参数

*方法一:通过请求头设置,参考第2节内容,

*方法二:URL参数,方法1:query string,查询字符串

import requests

url = 'http://www.httpbin.org/get'
# url参数
new_url = f'{url}?name=li&pass=123456'
resp = requests.request('GET',new_url)
print(resp.text)

*方法三:URL参数方法2:params关键字参数设置URL参数

import requests

url = 'http://www.httpbin.org/get'
params = {'name': 'li', 'pass': '123456'}
resp = requests.request('GET', url=url, params=params)
print(resp.text)

运行结果:(两种方法是一样的)

在postman中进行设置:

*方法四:form-data,存在字典当中,然后通过data关键字参数传递

 注意:get请求是不能通过请求体传递参数的,所以要把url和request中的请求方法改成post

import requests

url = 'http://www.httpbin.org/post'
data = {'name': 'li', 'pass': '123456'}
resp = requests.request('POST', url=url, data=data)
print(resp.text)

 运行结果:

在postman中进行设置:

*方法五:支持form-data,query string,header同时传递参数

import requests

url = 'http://www.httpbin.org/post'
new_url = f'{url}?name=li'
data = {'pass': '123456'}
headers = {'xxx':'111'}
resp = requests.request('POST', url=new_url, data=data,headers=headers)
print(resp.text)

运行结果:

 在postman中进行设置:

*方法六:json数据,自动修改Content-Type的值为application/json

import requests

url = 'http://www.httpbin.org/post'
data = {'name': 'li', 'pass': '123456'}
resp = requests.request('POST', url=url, json=data)
print(resp.text)

 运行结果:

注意:form-data和json不能同时传递参数,因为请求体只能选择一种方式

在postman中进行设置:

4.响应的格式

import requests

url = 'http://www.httpbin.org/post'
resp = requests.request('POST', url=url)
print(resp.text)  # string
print(resp.content)  # bytes
print(resp.json())  # dict

运行结果:

 响应格式通常是text,content,json三种,三种格式可以相互转化

text --> content

# text ==>编码 content
new_content = resp.text.encode()
print(new_content)

运行结果:

conten --> text

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

json --> dict (反序列化)

import json

# json ==> dict,反序列化
json_data = '{"key":"value","key1":"value2","key3":[1,2,3],' \
            '"key4":true,"key5":null,"key6":123,"key7":{"key8":false}}'
dict_data = json.loads(json_data)
print(json_data)
print(dict_data)
print(type(dict_data))

运行结果:

{"key":"value","key1":"value2","key3":[1,2,3],"key4":true,"key5":null,"key6":123,"key7":{"key8":false}}
{'key': 'value', 'key1': 'value2', 'key3': [1, 2, 3], 'key4': True, 'key5': None, 'key6': 123, 'key7': {'key8': False}}
<class 'dict'>

可以看到转化后的字典里的双引号变成了单引号,小写的true,false变成了python中的True,False,json中的null变成了python中的None

dict --> json (序列化)

import json

# dict ==> json
json_data = '{"key":"value","key1":"value2","key3":[1,2,3],' \
            '"key4":true,"key5":null,"key6":123,"key7":{"key8":false}}'
dict_data = json.loads(json_data)
json_new_data = json.dumps(dict_data)
print(json_new_data)

运行结果:

{"key": "value", "key1": "value2", "key3": [1, 2, 3], "key4": true, "key5": null, "key6": 123, "key7": {"key8": false}}
<class 'str'>

总结:

序列化和反序列化:

序列化:编程语言的数据类型转化成通用的数据格式,文本和二进制。string

反序列化:通用的数据格式转化成编程语言的数据类型

为什么不用eval()去除字符串呢?,因为eval()本质上是转化为可执行的python代码,很危险,如linux系统下,rm -f 一样删除所有文件

json是字符串,具有特定标识,格式的字符串:'{"key":"value","key1":"value2"}'

校验是不是json格式的工具:https://www.json.cn/

json的引号必须是双引号,之前的逗号也必须是英文的

json是字符串格式,是通用的概念,里面支持不同的数据类型的值

5.token的处理流程

操作思路:

1.先登录,得到登录接口返回的token值,可能包含token type,bearer

2.再访问其他接口时,带上返回的token值

3.token放在请求什么位置传输,是由开发说的算

4.一般标准的规范,是放在Authorization请求头当中,而且通常会设置一个前缀Bearer或JWT,格式:Authorization:Bearer  token值,没有也正常,一切要看开发是怎么设置的

以前程贷接口作为例子:

import requests

# 访问登录接口
url = 'http://api.lemonban.com:8766/futureloan/member/login'
headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
data = {
    "mobile_phone": "13711112222",
    "pwd": "12345678"
}
respons = requests.request('post', url=url, headers=headers, json=data)
print(respons.json())
# 得到token
token_value = respons.json()['data']['token_info']['token']
# 访问充值接口
url_recharge = 'http://api.lemonban.com:8766/futureloan/member/recharge'
headers = {
    "X-Lemonban-Media-Type": "lemonban.v2",
    "Content-Type":"application/json",
    "Authorization":f"Bearer {token_value}"
}
data = {
    "member_id":"10003494",
    "amount":1000
}
resp = requests.request('post',url=url_recharge,headers=headers,json=data)
print(resp.json())

 运行结果:

{'code': 0, 'msg': 'OK', 'data': {'id': 10003494, 'leave_amount': 3593701.31, 'mobile_phone': '13711112222', 'reg_name': 'peter', 'reg_time': '2021-07-18 10:06:48.0', 'type': 1, 'token_info': {'token_type': 'Bearer', 'expires_in': '2021-10-22 23:09:53', 'token': 'eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDAzNDk0LCJleHAiOjE2MzQ5MTUzOTN9.ZrUITJ-6TOzQVln0mS9XdRffUtrK1BqpWHFM4gVZtKaY8GNCzvAU8cCIC_sSjNTkLY5smtem8mH_MKrE9mP0bA'}}, 'copyright': 'Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved'}
{'code': 0, 'msg': 'OK', 'data': {'id': 10003494, 'leave_amount': 3594701.31, 'mobile_phone': '13711112222', 'reg_name': 'peter', 'reg_time': '2021-07-18 10:06:48.0', 'type': 1}, 'copyright': 'Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved'}

从结果可以看到登录接口获取到的总金额是3593701.31,充值后的总金额是3594701.31,所以充值成功

Guess you like

Origin blog.csdn.net/weixin_40611700/article/details/120864781