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,所以充值成功