接口关联和requests库

一、接口关联

postman的接口

postman的接口关联配置:js代码,重点在于思路。

// 定义jsonData这个变量 接受登录接口的返回结果
var jsonData = JSON.parse(responseBody);
// 从返回结果里提取token/id值,并赋值给token/id变量值作为环境变量
pm.globals.set("token",jsonData.access_token)
pm.globals.set("type",jsonData.token_type)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于这个工具具体的详细使用: 参数化 + 断言 + CSV批量等 都可以

二、接口鉴权 – 鉴别用户权限

鉴权:鉴定是否有权限访问。
要做鉴权的原因是: http协议本身是无状态【无记忆】的。每个http请求之间是没有关系的。 所以解决方案就是手动加上用户的凭证信息。方案主要有两种:

  • cookie和session机制 : 配套存在的两个概念

  • token机制

cookie和session(网站用的比较多-web–ERP项目案例)
cookie是一门客户端技术,一般是由服务器生成返回给浏览器客户端来保存的,并且cookie是以键值对的形式保存在浏览器客户端的,每一个cookie都会有名称,值,过期时间…。cookie有很多使用场景,在项目中比较常见的有:

  • 1.登录记住用户名

  • 2.记录用户浏览记录

Cookie过期时间:

  • 日期时间: 开发设置的过期时间
  • 会话期间:浏览器关闭 cookies失效了。

Http协议是无状态的,Session是一种让请求从无状态变成有状态的机制,session是服务端的会话技术,当用户登录了系统,服务器端的就会创建一个会话,此会话中可以保存登录用户的信息。

在这里插入图片描述
在这里插入图片描述

思考问题: 在cookies和session机制有一个角色比较累== 服务器很累,存在很多用户的session。-- 存储压力 这种机制淘汰。

token机制(适用于任何的前端-L4mall项目案例)–替换更好的机制,更主流。

  • session机制的缺陷: 服务器存储很多用户的会话信息 ,需要很多空间存储! ==成本高。替代的方案就是token机制!

token的意思是“令牌”,是服务端生成的加密后一串字符串,作为客户端进行请求的一个标识。

  • 服务器 ,不存储会话(加密【签名】+令牌),签名: 需要加密算法 + 秘钥,而这些只有服务器知道,用于后续的验证token的真实性

  • token一般通过消息体某字段返回给客户端

  • token也有时效性: 失效时间 看开发定义。

在这里插入图片描述
通过加密和解密计算,计算的成本 换取存储成本。

面试题:token和session,cookies有什么区别?优劣势?

token:-更加主流,可以适用于任何的前端

  • 1-客户端发起登录请求并且登录成功之后,服务端生成一段加密之后的字符串,客户端会将此字符串设置在请求头里面,并且再去发送需要权限的请求

  • 2-token不用服务器存储会话,解决了服务器存储的压力;但是每次校验都需要解密计算,也消耗CPU资源,用计算成本换取存储成本。

  • 3-适用于各种形态的应用,包括web app等。

cookie+session:网站用的比较多

  • 1- 客户端发起登录请求并且登录成功之后,服务端生成session(会话),并且生成一个session id与之对应,服务端会将session id设置在响应头set-cookie,客户端自动识别set-cookie响应头字段,并且将其值保存到本地的cookie中,之后如果需要权限就只需要从cookie中取出来session id即可

  • 2-服务器需要存储会话信息,有很大的存储压力。

  • 3-适用于web应用,cookies存储再浏览器里,比较容易丢失。

接口鉴权的步骤

第一步:通过登录接口,获取权限令牌。

  • 服务端返回权限令牌给客户端, 每次登录令牌值都不一样。

第二步:在接下来的每一个请求当中,都带上权限令牌。

  • 以什么样的形式带上,开发人员决定,可以是请求头带 或者请求体带, 开发封装接口的时候决定形式。

做接口测试,第一步要解决的问题:项目是什么样的鉴权方式。

postman工具如何处理鉴权?
  • 在登录之后的接口,做数据提取token
  • 存储在环境变量里
  • 后续接口需要用再调用 == {{变量名}}
// 定义jsonData这个变量 接受登录接口的返回结果
var jsonData = JSON.parse(responseBody);
// 从返回结果里提取token/id值,并赋值给token/id变量值作为环境变量
pm.globals.set("token",jsonData.access_token)
pm.globals.set("type",jsonData.token_type)
Python代码如何处理鉴权

requests是Python中简单好用的HTTP库【第三方库】,可以模拟客户端向服务器发送请求。

  • 第一步安装:pip install requests

  • 第二步引入模块:import requests

  • 第三步操作:发起一个请求(get,post)

import requests# 第一步 执行登录接口
url_login = "http://shop.lemonban.com:8107/login"
param = {"principal":"lemon_py","credentials":"12345678","appType":3,"loginType":0}
response = requests.request(method="post",url=url_login,json=param)  # 这种更加通用 重点掌握。
login_resp = response.json() # 字典格式# 第二步: 获取登录结果里token,赋值给变量
token = login_resp["access_token"]
token_type = login_resp["token_type"]# 第三步: 上传接口里调用这个变量-- 在请求头里传token值进去
url= "http://shop.lemonban.com:8107/p/file/upload"
file_obj = {"file":("py65图片",open("tricy.png","rb"))}  # 文件参数
header= {"Authorization":f"{token_type}{token}"}  # 请求头 拼接token变量
res = requests.request(method="post",url=url,files=file_obj,headers=header)
print(res.text)

1.1 发送GET请求 -搜索接口

requests.get(url, params=None, **kwargs)
  • url: 接口地址
  • params:查询参数,为可选参数,该参数是一个字典类型
  • **kwargs:其他可选参数,如headers,files,cookies,auth,timeout,json等
    • 注意1: 必须要关键字名字一致 因为要名字一致才能被服务器认识
    • 注意2:要用字典格式传输
import requests
url="http://mall.lemonban.com:8107/search/searchProdPage"
params= {"prodName":"phone"}
response = requests.get(url=url,params=params)
print(response) # Response对象,可以获取详细信息
print(response.status_code) # 获取响应状态码
print(response.headers) #获取响应头
print(response.text) #获取响应数据
print(response.json()) # 把json格式的响应数据,转换成python字典
print("http响应头中的cookies:",dict(response.cookies)) # 获取cookie

1.2 发送POST请求-- 登录接口
参数有data 和json ,这是因为post请求发送的参数在请求体,请求数据的格式我们上节课讲过有三种比较主流的类型,分别用来传参的关键字是不一样的。

requests.post(url, data=None, json=None, **kwargs)

【application/json】 – 电商项目的登录接口
json传参,需要用到json参数 , 默认就会content-type 等于application/json,这个头部都可以不传。

import requests
# post请求 --application/json
url="http://shop.lemonban.com:8107/login"
params=
{"principal":"lemon_py","credentials":"12345678","appType":3,"loginType":0}
response = requests.post(url=url,json=params)
print(response) # Response对象,可以获取详细信息
print(response.status_code) # 获取响应状态码
print(response.headers) #获取响应头
print(response.text) #获取响应数据
print(response.json()) # 把json格式的响应数据,转换成python字典
print("http响应头中的cookies:",dict(response.cookies)) # 获取
cookie

【application/x-www-form-urlencoded】 - ERP项目的登录接口url编码传参,需要用到data参数进行传参

import requests
# post请求- form-data
params =
{"loginame":"admin","password":"e10adc3949ba59abbe56e057f20f883e"}
url = "http://erp.lemfix.com/user/login"
response = requests.post(url=url,data=params)
print(response) # Response对象,可以获取详细信息
print(response.status_code) # 获取响应状态码
print(response.headers) #获取响应头
print(response.text) #获取响应数据
print(response.json()) # 把json格式的响应数据,转换成python字典
print("http响应头中的cookies:",dict(response.cookies)) # 获取
cookie

【multipart/form-data】— 上传文件接口,这个接口需要鉴权

当我们需要传输大容量的数据到服务端时(比如上传文件),我们通常使用multipart/form-data传参类型

在requests中通过指定files参数用来处理文件上传的;files参数的值,也必须是字典,字典的内容如下:
{name: (filename,文件对象(open打开),媒体类型(Content-Type))}

name是你传的是啥 ,开发定义的名字参数的名字

filename: 可以自己定义上传的文件的名字 不用跟真实的名字一样; 抓包就是直接用的文件名字;然后会显示在数据库里filename字段里。 不加 就默认用文件本身的名字。

媒体类型:content-type也可以不加, 其实就是MIME类型,但是可以不加 可以自动识别识别文件媒体类型。

注意事项:不需要加content-type,因为files这个参数默认就会用multipart/form-data 这个格式传输,上传文件接口数据类型是这个;

import requests
url = "http://shop.lemonban.com:8107/p/file/upload"
method = "post"
file_obj = {"file":("pythontest.png", open("code.png", "rb"),
"image/jpeg")}
res = requests.request(method,url,files=file_obj)
print(res.text)

但是报错,是因为没有鉴权。

处理接口鉴权

  • 上传文件接口需要用户先登录再操作,所以上传之前先登录。
  • 提取登录后返回的token
  • 提取token 的方法 :用json()转化为字典格式,再用字典取值
    • jsonpath
  • 再给上传接口使用。
import requests
#登录接口
url="http://shop.lemonban.com:8107/login"
params=
{"principal":"lemon_py","credentials":"12345678","appType":3,"loginType":0}
response= requests.request(method="post",url=url,json=params)
token = response.json()["access_token"]
print(token)
url = "http://shop.lemonban.com:8107/p/file/upload"
method = "post"
file_obj = {"file":("pythontest.png", open("tricy.png", "rb"))}
head = {"Authorization":"bearer"+token}
res =
requests.request(method="post",url=url,files=file_obj,headers=head)
print(res.text)

cookies鉴权

"""
cookies鉴权 : session相关的。
如果我登录用session发送,后续所有的都在用这同一个session里操作,那么我就可以自动带上的登录cookies 不需要手动传。代码实现: 不用requests库 直接发送接口请求,用实例化的Session类。
"""
import requests# 实例化操作
session = requests.Session()# ERP项目登录
url= "http://erp.lemfix.com/user/login"
param = {"loginame":"test123","password":"e10adc3949ba59abbe56e057f20f883e"}
res = session.request(method="post",url=url,data=param)
# res = requests.request(method="post",url=url,data=param)
print(res.text)# 添加角色接口
url = "http://erp.lemfix.com/role/add"
param = {"info":'{"name":"333"}'}
resp = session.request(method="post",url=url,data=param)
# resp = requests.request(method="post",url=url,data=param)
print(resp.text)
requests设置代理抓包

让Fiddler能够抓取到requests代码发送过来的请求:调试利器
proxies = { “http”:“http://ip:端口号”}如果请求发送不成功,可以设置fiddler作为代理:抓包查看。

proxies = {"http":"http://192.168.0.104:8887"}
requests.get(url, proxies=proxies)
"""
定位问题小技巧: 如果接口请求发送失败了,那么可以设置代理,引导fiddler,可以在fiddler里查看请求信息 定位问题
proxies = { "http":"http://ip:端口号"}
"""
import requestsproxies = {"http":"http://192.168.31.25:8887"}# 本地ip,fiddler上的拦截端口
url= "http://erp.lemfix.com/user/login"  #项目地址
param = {"loginame":"test123","password":"e10adc3949ba59abbe56e057f20f883e"}  #登陆信息res = requests.request(method="post",url=url,data=param,proxies=proxies)
print(res.text)

requests库

发送各种接口的请求: get post请求
各种参数类型: json 表单格式 等

requests发送接口请求之后的结果是响应消息。

注意: 在requests库里,除了url和请求方法之外,其他的数据都要用字典的格式传输。

传参的方式:
1、get请求,params 接受
2、post请求:content-type的类型有关系。

  • application/json格式数据,json关键字接受参数
  • application/x-www-form-urlencoded,data关键字接受参数
import requests# post 请求 --请求的四大要素,登录接口  == application/json格式数据,json关键字接受参数
url_login = "http://shop.lemonban.com:8107/login"
param = {"principal":"lemon_py","credentials":"12345678","appType":3,"loginType":0}
header = {"Content-Type":"application/json; charset=UTF-8"}
# json参数接受,那么content-type的头部可以不传。# response = requests.post(url=url,json=param,headers=header)
response = requests.request(method="post",url=url_login,json=param)  # 这种更加通用 重点掌握。
print(response) # Response对象,可以获取详细信息
print(response.status_code)  # 获取响应状态码
print(response.headers)  #获取响应头
print(response.text)   #获取响应数据 --响应体字符串格式
print(response.json())  # 把json格式的响应数据,转换成python字典--响应体字典格式# get请求 -- 搜索接口, 如果请求方法是get方法 参数就是params接受
# url_search = "http://shop.lemonban.com:8107/search/searchProdPage?prodName=真皮圆筒包"
# resp = requests.request(method="get",url=url_search)url_search = "http://shop.lemonban.com:8107/search/searchProdPage"
param = {"prodName":"真皮圆筒包"}
resp = requests.request(method="get",url=url_search,params=param)
print(resp.text)

发送各种接口的请求: get post请求
各种参数类型: json 表单格式 等

requests发送接口请求之后的结果是响应消息。

注意: 在requests库里,除了url和请求方法之外,其他的数据都要用字典的格式传输。

传参的方式:
1、get请求,params 接受
2、post请求:content-type的类型有关系。

  • application/json格式数据,json关键字接受参数,content-type的头部不需要传 默认就是json
  • application/x-www-form-urlencoded,data关键字接受参数,content-type的头部不需要传 默认就是form
  • multipart/form-data:支持文件/图片等传输 ,一般都是文件 图片上传接口

import requests#application/x-www-form-urlencoded,data关键字接受参数  --ERP项目url= "http://erp.lemfix.com/user/login"
param = {"loginame":"test123","password":"e10adc3949ba59abbe56e057f20f883e"}
res = requests.request(method="post",url=url,data=param)
print(res.text)

发送各种接口的请求: get post请求
各种参数类型: json 表单格式 等

requests发送接口请求之后的结果是响应消息。

注意: 在requests库里,除了url和请求方法之外,其他的数据都要用字典的格式传输。

传参的方式:
1、get请求,params 接受
2、post请求:content-type的类型有关系。

  • application/json格式数据,json关键字接受参数,content-type的头部不需要传 默认就是json
  • application/x-www-form-urlencoded,data关键字接受参数,content-type的头部不需要传 默认就是form
  • multipart/form-data:支持文件/图片等传输 ,一般都是文件 图片上传接口
    – 二进制流的格式传输的
    – 需要files关键字接受 文件参数。
    - 文件参数也要用字典的格式表示:
    {name: (filename,文件对象(open打开),媒体类型(Content-Type))}
    • name是你传的是啥 ,开发定义的名字参数的名字
    • filename:可以自己定义上传的文件的名字 不用跟真实的名字一样; 抓包就是直接用的文件名字;然后会显示在数据库里filename字段里。 不加 就默认用文件本身的名字。
    • 媒体类型:content-type也可以不加, 其实就是MIME类型,但是可以不加 可以自动识别识别文件媒体类型。

但是如此执行接口报错: “error”:“unauthorized” 因为这个接口需要token鉴权。

  • 但是是登录之后才能操作的接口都需要鉴权。 登录之前接口不需要。

import requests# 上传接口 : multipart/form-data:支持文件/图片等传输 ,一般都是文件 图片上传接口  files接受参数url= "http://shop.lemonban.com:8107/p/file/upload"
# file_obj = {"file":open("tricy.png","rb")}  # 文件参数
file_obj = {"file":("py65图片",open("tricy.png","rb"),"image/jpeg")}  # 文件参数
res = requests.request(method="post",url=url,files=file_obj)
print(res.text)

问题:
1、fiddler代理设置不成功的,设置了代理就接口发送不通的,把代理的IP地址设置为127.0.0.1【本机回环地址】
2、get请求方法,参数接受用params关键字;
post请求,参数接受用data或者json关键字;

  • data: 当参数格式是表单格式的
  • json: 当参数格式是json格式的
    文件上传接口: 用files关键字接受
    3、json文件格式化输出 快捷键 : alt + ctrl +L

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何添加随机种子保证代码每次复现的一致性?

如何添加随机种子保证代码每次复现的一致性? 在main()程序中首先设定随机种子: def set_seed(seed42):os.environ[PYTHONHASHSEED] str(seed)random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.backends…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎,是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

Java毕业设计 基于SSM网上二手书店系统

Java毕业设计 基于SSM网上二手书店系统 SSM jsp 网上二手书店系统 功能介绍 用户:首页 图片轮播 图书查询 图书分类显示 友情链接 登录 注册 图书信息 图片详情 评价信息 加入购物车 资讯信息 资讯详情 个人中心 个人信息 修改密码 意见信息 图书收藏 已经付款 邮…

数据仓库的魅力及其在企业中的应用实践

数据仓库,这一创新性的概念来自于比尔恩门,从1980年代末提出以来,便凭借其独特的架构设计和强大的数据处理能力,在全球商业领域中掀起了一场革命。它不仅是解决企业海量数据存储和查询需求的关键技术,更是推动企业实现…

rel=“dns-prefetch“和rel=“preconnect“ 结合使用,以及link属性的详细介绍

使用 dns-prefetch DNS-prefetch 尝试在请求资源之前解析域名。这可能是后面要加载的文件,也可能是用户尝试打开的链接目标。 为什么要使用 dns-prefetch? 当浏览器从(第三方)服务器请求资源时,必须先将该跨源域名解…

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

李宏毅深度强化学习导论——策略梯度

引言 这是李宏毅老师深度强化学习视频的学习笔记,主要介绍策略梯度的概念,在上篇文章的末尾从交叉熵开始引入策略梯度。 如何控制你的智能体 上篇文章末尾我们提到了两个问题: 如何定义这些分数 A A A,即定义奖励机制&#xff…

11.数据库技术(上)

函数依赖、规范化这类难的知识点,考的少; 基本概念、sql语句、关系代数运算、关系代数运算与sql语句的转换,考的多; 主要议题:

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群(这个要求暂时不实现) 编写接口&…

如果有意外,这个窗口就会弹出,希望你们能够看到!——夜读(逆天打工人爬取热门微信文章解读)

第一个日二更 引言Python 代码第一篇 定时任务运行结果 第二篇 人民日报 【夜读】最好的教养,是对家人和颜悦色结尾 时间不会无缘无故增加 也不会无缘无故减少 我们唯一能够控制就是 加大时间的密度 引言 为了不让我在大庭广众下大喊我是沙比 我来更新文章啦 这次带…

nysm:一款针对红队审计的隐蔽型后渗透安全测试容器

关于nysm nysm是一款针对红队审计的隐蔽型后渗透安全测试容器,该工具主要针对的是eBPF,能够帮助广大红队研究人员在后渗透测试场景下保持eBPF的隐蔽性。 功能特性 随着基于eBPF的安全工具越来越受社区欢迎,nysm也应运而生。该工具能保持各种…

帮企建站宝响应式建站源码系统 带完整安装代码包以及搭建教程

在当今数字化时代,拥有一个功能强大且用户友好的网站是企业成功的重要基石。为了满足广大企业对于快速搭建高质量网站的需求,罗峰给大家分享一款“帮企建站宝响应式建站源码系统”。这一系统不仅包含了完整的安装代码包,还配备了详尽的搭建教…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅲ)

1.连接查询 连接查询&#xff1a;同时涉及多个表的查询 连接条件或连接谓词&#xff1a;用来连接两个表的条件 一般格式&#xff1a; [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [&l…

QT(6.5) cmake构建C++编程,调用python (已更新:2024.3.23晚)

一、注意事项 explicit c中&#xff0c;一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)&#xff0c;承担了两个角色&#xff0c;构造器、类型转换操作符&#xff0c; c提供关键字explicit&#xff0c;阻止转换构造函数进行的隐式转换的发生&#…

mysql增量备份与修复

MySQL数据库增量恢复 1.一般恢复 将所有备份的二进制日志内容全部恢复 2.基于位置恢复 数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作 发生错误节点之前的一个节点&#xff0c;上一次正确操作的位置点停止 3.基于时间点恢复 跳过…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二&#xff1a;布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

2015年认证杯SPSSPRO杯数学建模C题(第一阶段)荒漠区动植物关系的研究全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 C题 荒漠区动植物关系的研究 原题再现&#xff1a; 环境与发展是当今世界所普遍关注的重大问题, 随着全球与区域经济的迅猛发展, 人类也正以前所未有的规模和强度影响着环境、改变着环境, 使全球的生命支持系统受到了严重创伤, 出现了全球变暖…

C++动态内存管理:new/delete与malloc/free的对比

在C中&#xff0c;动态内存管理是一个至关重要的概念。它允许我们在程序运行时根据需要动态地分配和释放内存&#xff0c;为对象创建和销毁提供了灵活性。在C中&#xff0c;我们通常会用到两对工具&#xff1a;new/delete 和 malloc/free。虽然它们都能够完成类似的任务&#x…

Windows如何搭建 ElasticSearch 集群

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中。 除了负载能力&#xff0c;单点服务器…

map china not exists. the geojson of the map must be provided.

map china not exists. the geojson of the map must be provided. 场景&#xff1a;引入echarts地图报错map china not exists. the geojson of the map must be provided. 原因&#xff1a; echarts版本过高&#xff0c;ECharts 之前提供下载的矢量地图数据来自第三方&…