requests请求接口(下)

requests
安装  pip install requests

# 常见的接口请求参数类型:
#    查询字符串参数,常用于get请求,其他请求用的比较少
#       requests发送请求,传递查询字符串参数,请求参数以字典形式保存,使用params传递,
参数会直接拼接在URL地址后面

post请求使用json还是data其实主要看两点
1.Content-Type
2.传递数据是Form Data还是Request Payload
#    json类型的参数
#       请求参数类型为  content-type: application/json,传递数据用的
Request Payload,requests发送请求,传递json参数,使用json去传递;
需要传递 {"a":1,"b":2},实际传递了 {"a":1,"b":2};
使用json参数,不管报文是str类型(json字符串),
还是dict类型(json对象),如果不指定headers中content-type的类型,
默认是:application/json
#    表单类型的参数
#       请求参数类型为  content-type: application/x-www-form-urlencoded,
传递数据用的Form Data,requests发送请求,传递表单参数,使用data去传递;
需要传递 {"a":1,"b":2},实际传递了a=1&b=2格式;使用data参数,
报文是dict类型(json对象),如果不指定headers中content-type的类型,
默认application/x-www-form-urlencoded,
报文是str类型(json字符串),如果不指定headers中content-type的类型,
默认application/json
#    文件上传
#        请求参数类型为  content-type: multipart/form-data,
文件参数要使用files进行传递
#        文件参数的组装  {'参数名':('文件名',open以rb模式打开文件,'文件类型')}  
或  [('参数名':('文件名',open以rb模式打开文件,'文件类型'))]
# 以上请求类型,如果使用浏览器请求默认会加个content-type字段并显示对应的参数类型声明;
# 使用python请求的话requests模块会自动在请求头中加上content-type字段
并显示对应的参数类型声明
import requests

# ---------------查询字符串参数传递------------------
# 接口地址
url = 'http://apis.juhe.cn/xzqh/query'

# get请求参数,以字典形式保存
data = {'fid': 411425,
        'key': '289b515986e812b5cb0250a2a76dd226'}

response = requests.get(url=url, params=data)
print(response.text)
# ---------------json类型参数传递------------------
url2 = 'http://apis.juhe.cn/xzqh/query'
# 参数
params = {
    'fid': '411425',
    'key': '289b515986e812b5cb0250a2a76dd226'
}
# 请求头
headers = {
    'test': 'test'
}
res2 = requests.post(url2, json=params, headers=headers)
print(res2.text)
# ---------------表单类型参数传递------------------
url3 = 'http://apis.juhe.cn/xzqh/query'
# 参数
params = {
    'fid': '411425',
    'key': '289b515986e812b5cb0250a2a76dd226'
}
res3 = requests.post(url3, data=params)  # timeout=5  5秒钟无响应返回超时
print(res3.json())
# ---------------文件上传------------------
url4 = 'http://apis.juhe.cn/xzqh/query'
# 参数,file单独一个字典保存,其中值为元组形式内包含三个参数
params = {
    'fid': '411425',
    'key': '289b515986e812b5cb0250a2a76dd226'
}
file = {
    'pic': ('test.gif',open(r'test\address','rb'),'image/gif')
}
res4 = requests.post(url4, data=params,files=file)
print(res4.text)

# 响应对象response
# http响应状态码: response.status_code
# 返回的数据提取
#   text属性(str)  获取的是原生的json字符串,可能会出现乱码;如果出现乱码使用content获取二进制再转换格式,即第二种方法
#   content属性(bytes二进制)  可以使用decode指定编码转换成字符串
#   json()方法(dict)  获取的是json转换的字典,把json格式转换成对应的python格式 如null转换成None;通常使用这种方法
import requests
# 接口地址
url = 'http://apis.juhe.cn/xzqh/query'

# get请求参数,以字典形式保存
data = {'fid': 411425,
        'key': '289b515986e812b5cb0250a2a76dd226'}

response = requests.get(url=url, params=data)
print(response.text)
print(response.content.decode('utf8'))  #可以使用decode指定编码转换成字符串,结果同response.text
print(response.json())  # response.json()方法底层就是调用json.loads(res)去实现的
import json
res = response.text
res = json.loads(res)
print(res)  # 结果同response.json()

# 读取json数据  .text获取的是原生的json字符串
import json
from jsonpath import jsonpath

with open('test.json','r',encoding='utf8') as f:
    res = json.load(f)

print(res,type(res))  # 转换成python字典格式,如null转换成None
res2 = jsonpath(res,'$[test]')  # 只能查找第一层,查不到返回False
res3 = jsonpath(res,'$.test')  # 只能查找第一层,查不到返回False
res4 = jsonpath(res,'$..test')  # 可以查找所有节点
print(res2,res3,res4)

 


 
 

# jsonpath提取数据
# 安装 pip install jsonpath
from jsonpath import jsonpath
import requests
# {'code': 0,
# 'msg': 'OK',
# 'data': {'id': 1234597408, 'reg_name': '小柠檬', 'mobile_phone': '13366666666'},
# 'copyright': 'Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved'}
# 接口地址
url = 'http://api.lemonban.com/futureloan/member/login'

# 参数
params = {
    'mobile_phone': '13366666666',
    'pwd': 'lemonban'
}

# 请求头
headers = {
    'X-Lemonban-Media-Type': 'lemonban.v2'
}

response = requests.post(url,json=params,headers=headers)
res = response.json()
print(res)
# {'code': 0,
# 'msg': 'OK',
# 'data': {
#     'id': 1234597408,
#     'leave_amount': 0.0,
#     'mobile_phone': '13366666666',
#     'reg_name': '小柠檬',
#     'reg_time': '2021-06-08 10:28:43.0',
#     'type': 1,
#     'token_info': {
#        'token_type': 'Bearer',
#        'expires_in': '2021-06-08 10:39:31',
#        'token': 'eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEyMzQ1OTc0MDgsImV4cCI6MTYyMzExOTk3MX0.VCII2ssQXPO3DtDuwBb1-yRefRB7fzrzEkYAAu9LufFg3dwNRDrzhdpqMtYcqIlqzMIwN3-Xxw0j_9RnEEFm1Q'}},
# 'copyright': 'Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved'}
# 响应体,提取token;如果是响应头提取  res_headers = response.headers; 获取cookies  cookies = response.cookies
token = res['data']['token_info']['token']
print(token)  # 得到的是字符串
# 使用jsonpath模块提取token
token1 = jsonpath(res,'$..token')  # ..无论节点在哪一层均可使用,如果找不到返回False
print(token1,type(token1))  # <class 'list'> 可能会查询到多个值,可使用下标取值

# token鉴权方式
# 1、发送登录请求返回token等信息(有可能在响应头,有可能在响应体,具体看开发操作)
# 2、获取token等需要的信息
# 3、请求需要鉴权的接口即可使用token
import requests
from jsonpath import jsonpath

# 接口地址
url = 'http://api.lemonban.com/futureloan/member/login'

# 参数
params = {
    'mobile_phone': '13366666666',
    'pwd': 'lemonban'
}

# 请求头
headers = {
    'X-Lemonban-Media-Type': 'lemonban.v2'
}

response = requests.post(url, json=params, headers=headers)
# print(response.json())

# 提取token等相关信息
token = jsonpath(response.json(), '$..token')[0]
token_data = f'Bearer {token}'
member_id = jsonpath(response.json(), '$..id')[0]
# print(member_id)
# 充值接口地址
url1 = 'http://api.lemonban.com/futureloan/member/recharge'
# 请求参数
params1 = {'member_id': member_id,
           'amount': 50000.25
           }
# 请求头
headers1 = {
    'X-Lemonban-Media-Type': 'lemonban.v2',
    'Authorization': token_data
}
res1 = requests.post(url1, json=params1, headers=headers1)
print(res1.json())

cookie+session鉴权
http请求都是无状态的,每个请求都是独立的,请求时不会记录之前的状态,可以通过cookie或token来传递用户登录的状态信息
requests模块中有一个Session类(首字母大写),使用session类的同一个对象发送请求,会自动保存之前请求的cookie信息


excel中尽量用双引号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值