request库用来发送http请求以及接受http响应的python第三方库,主要用于接口自动化。
安装命令如下:
$ pip install request
1、requests.get()
url接口地址;params传递参数
2、requests.post()
url接口地址;data用于传参;json也适用于传参;
主要通过请求头Contetn-Type区分
请求分四部分(缺一不可):请求方式、请求路径、请求头、请求正文
**Contetn-Type:作用是服务器要求传入的报文的内容类型**
Postman四种传参方式对应的Contetn-Type如下:
form-data:Contetn-Type:multipart/form-data;boundary=
x-www-form-urlencoded:Contetn-Type:application/x-www-form-urlencoded(通过表单方式上传)
raw:
text:Contetn-Type:text/plain(通过文本)
javascript:Contetn-Type:application/javascript
json:Contetn-Type:application/json(json格式)
html:Contetn-Type:text/html
xml:Contetn-Type::application/xml
binary:Contetn-Type:application/binary(二进制文件格式)
data和json传参以及Content-Type关系如下:
(1)data传参方式:(如果服务器用的是text/plain,那么使用data,报文类型为str)
报文是dict类型(字典类型),默认Contetn-Type使用application/x-www-form-urlencoded(相当于表单上传)
报文是str类型,那么默认Contetn-Type使用text/plain类型
(2)json传参,报文可以是str也可以是dict类型(字典类型用的多),默认Contetn-Type使用application/json
【注意】data不能传递嵌套的dict型数据,可以使用json.loads() 把json字符串转化为dict格式
json.loads() 把json字符串转化为dict格式
json.dumps() 把dict格式转化成json字符串
接口文档说明、通过抓包工具抓取
data可以传纯键值对的dict,也可以传str格式(不包括嵌套)
json可以传任何形式的dict。如下图包括嵌套,tag为键,后面嵌套dict键值对
3、requests.put()
4、requests.delete()
【参数】
method 请求方式
url 请求路径
params=None get方式传参
data=None post方式传参
json=None post方式传参
headers=None 请求头
cookies=None 请求cookie
files=None 文件上传
【使用示例】
url='https://eolink.o.apispace.com/456456/function/v001/city'
payload={"location" : "上海","items" : "10","area" : "china","language" : "","withTz" : "","withPoi" : "false"}
headers={"X-APISpace-Token":"自己的Token", "Authorization-Type":"apikey"}
res=requests.request("GET", url, params=payload, headers=headers)
res.json() 获得返回的json对象(字典格式的数据)
res.text() 获得返回的字符串格式的数据
res.content() 获得返回的bytes字节类型的数据
res_status_code() 返回状态码
res.reason 返回状态信息
res.cookies 返回cookie信息
res.headers() 返回响应头
res.request.XXX 返回请求的数据,如:请求头,请求参数。。
【json格式】
①键值对 ②数组 json是字典类型的字符串格式
【示例代码】
#get接口地址APIspace(手机号码归属地和运营商,200次,可QQ登录,不需要实名验证):https://www.apispace.com/console/api?orgId=18467
#post接口地址APIspace(手机号码归属地,200次,可QQ登录,不需要实名验证):https://www.apispace.com/eolink/api/teladress/introduction
#接口实现过程(需要从接口文档获得的数据):
#url接口地址:
#params接口参数:用户名 个人信息(哪些是必填,哪些是不填,哪些是可填可不填)
#请求方式:get、post、delete
#响应结果
import requests
class TestRequests:
#request.get() url接口地址;params传递参数
# post请求,查询手机号归属地和运营商
def test_rget(self):
url='https://eolink.o.apispace.com/phone/api/v1/forward/china/phone/attribution'
payload={"phone_number" : "13610048587"}
headers={
"X-APISpace-Token":"mhb9k3ivo75m2putbal*******",
"Authorization-Type":"apikey"
}
#使用request.request()方法实现
res=requests.request("GET", url, params=payload, headers=headers)
#res.text() 获得返回的字符串格式的数据
print('\n'+res.text)
#res.json() 获得返回的json对象(①键值对②字典格式的数据,不能包含嵌套)
print(res.json())
print('\n---------------------------')
#requests.post():url接口地址;两种传参方式:data和josn
#post请求,查询手机号归属地
def test_rpost(self):
url = 'https://eolink.o.apispace.com/teladress/teladress'
payload = {"mobile": "13610048587"}
# Contetnt-Type使用application/x-www-form-urlencoded(相当于表单上传)对应报文是dict类型(字典类型),post应为data传参
headers = {
"X-APISpace-Token": "mhb9k3ivo75m2putbaln*******",
"Authorization-Type": "apikey",
"Content-Type": "application/x-www-form-urlencoded"
}
# 使用request.request()方法实现
res = requests.request("POST", url, json=payload, headers=headers)
# data可以传递str或dic类型参数,单不能传递嵌套的dict型数据
# 使用json.dumps() 把dict格式转化成json字符串
# dpayload = json.dumps(payload)
# res = requests.request("POST", url, data=dpayload, headers=headers)
# res.text() 获得返回的字符串格式的数据
print('\n'+res.text)
# res.json() 获得返回的json对象(①键值对②字典格式的数据,不能包含嵌套)
print(res.json())
if __name__ == '__main__':
TestRequests.test_rget()
TestRequests.test_rpost()
请求分四部分(缺一不可):请求方式、请求路径、请求头、请求正文
【正则提取举例】提取html文件中某一个变量值,例如中的value的值
【代码如下】
import re
class TestZhengze:
cs_Token = ''
def test_strat(self):
#正则提取下列中的value值
str = ''
#复制左边界 name="bsToken" value="d170371c1389a005958220f155d17bb6"
#将要去取的值改为 (.*?)
#使用re.search()方法进行正则提取
obj = re.search('name="bsToken" value="(.*?)"',str)
print(obj.group(1))
#通过类引用全局变量,将取到的值保存到全局变量当中
TestZhengze.cs_Token = obj.group(1)
#测试再其他函数中使用这个全局变量
def test_token(self):
print('\n'+TestZhengze.cs_Token)
if __name__ == '__main__':
TestZhengze.test_strat()
TestZhengze.test_token()
四要素没问题但是接口返回出错,查找cookie鉴权是否正确
打开项目,F12进入开发者模式,查看cookie下是否有值(点击Application,选择Storage,点击Cookies。右边显示cookies详细信息。看到values下有值,说明存在cookie鉴权)
1、使用cookie关联
2、使用session关联
session鉴权不用传递cookie值也可以鉴权成功
代码如下:
import requests
from requests.cookies import RequestsCookieJar
#有cookie鉴权的接口测试,本测试中接口为bing搜索引擎
#成功输出如下
#-----------------
# , , , , , , , , , , ]>
#200
# , , , , , , , , , , ]>
#
#-----------------
# , , , , , , , , , , ]>
#{'MUID': '1868BFDD0D2465C51030AD630C0A6412', 'SRCHD': 'AF=000047', 'SRCHHPGUSR': 'SRCHLANG=zh-Hans', 'SRCHUID': 'V=2&GUID=A11E9B8919704A07AB4D91C5870AFB43&dmnchg=1', 'SRCHUSR': 'DOB=20230220', 'SUID': 'M', '_EDGE_S': 'F=1&SID=1DE257BD61F265E90302450360DC645B', '_EDGE_V': '1', '_HPVN': 'CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyMy0wMi0yMFQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIkRmdCI6bnVsbCwiTXZzIjowLCJGbHQiOjAsIkltcCI6MX0=', '_SS': 'SID=1DE257BD61F265E90302450360DC645B', 'MUIDB': '1868BFDD0D2465C51030AD630C0A6412'}
#1868BFDD0D2465C51030AD630C0A6412
class TestCookie:
#设置全局变量用于存放获取到的cookie
p_cookie = ''
def test_getcookie(self):
data = {"sb_form_c": "pdf"}
url = "https://cn.bing.com/?form=000047"
r = requests.post(url=url, data=data)
#提取cookie
TestCookie.p_cookie = r.cookies
print('\n-----------------')
print(TestCookie.p_cookie)
print(r.status_code)
#print(res.text)
print(r.cookies)
print('\n-----------------')
print(r.cookies) # response.cookies返回的是RequestsCookieJar对象
print(requests.utils.dict_from_cookiejar(r.cookies))#将返回的cookie转换为dict格式
print(requests.utils.dict_from_cookiejar(r.cookies)['MUID'])
#使用session鉴权
def test_session(self):
data = {"sb_form_c": "pdf"}
url = "https://cn.bing.com/?form=000047"
session = requests.session()
session.post(url=url, data=data)
cook = session.cookies
print('\n---------session--------')
print(session)
print(cook)
if __name__ == '__main__':
TestCookie.test_getcookie()
TestCookie.test_session()
【pycharm使用小技巧】
①自动导包:鼠标移动到需要到导包的语句,alt+回车,自动导包
②ctrl键点击方法,进入方法内部查看方法详细信息,如参数等
③ctrl+F 查找