当前位置: 首页 > news >正文

软件测试学习笔记丨Postman实战练习

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32096#h-22

二、实战练习

2.1 宠物商店接口文档分析

接口文档:http://petstore.swagger.io ,这是宠物商店接口的 swagger 文档。

2.1.1 什么是 swagger

  • Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。
  • 通俗的来讲,Swagger 就是将项目中所有想要暴露的接口展现在页面上,并且可以进行接口调用和测试的服务。
  • 现在大部分的项目都使用了 swagger,因为这样后端开发就不需要专门为接口使用者编写接口文档。
  • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档,这样就可以避免接口文档老旧不能使用的问题。
  • 而且通过 Swagger 页面,可以直接进行接口调用,降低了项目开发阶段的调试成本。

2.1.2 分析查询接口

接口的 swagger 文档怎么看。

在这里插入图片描述

2.1.3 调试宠物

怎么在页面上调试接口?
以查询宠物接口举例:

  • 点击 Try it out
  • 请求参数 status 选择 available
  • 点击 Execute 发出请求
  • 下方展示当前请求的 Curl 命令
  • 下方展示当前请求的完整 URL
  • 下方展示响应状态码和对应的响应体
  • 有了 swagger,就可以非常方便的获取到接口的信息,从而设计测试用例

2.2 接口测试用例设计

  • 宠物的 增、删、改、查 冒烟测试用例

查询宠物

新增宠物

更新宠物信息

删除宠物

2.3 编写断言

Tests 主要用来做断言,比如要测试返回结果是否含有某一字符串,就可以用到 Tests。

  • 断言,就是结果和预期对比
  • 如果一致,则用例通过,返回PASS
  • 如果不一致,断言失败,用例失败,失败返回 FAIL

test 中可以使用 JavaScript 脚本来进行断言的编写。如果本身不熟悉 JS 语法的话也没有关系,Postman 当中已经预置好了常用的断言。

  • 验证响应状态码Status Code:Code is 200
pm.test("响应状态码为 200", function () {pm.response.to.have.status(200);
});

status 方法中传入的值 200 就是预期结果,可以把括号中的状态码改为任意需要的值,比如 400

  • 检查响应体中是否包含某个字符串Response Body:contains string
pm.test("响应体中包含预期的字符串", function () {pm.expect(pm.response.text()).to.include("doggie");
});
  • 检测 JSON 中的某个值是否等于预期的值Response Body:JSON value check
pm.test("宠物名称为 doggie", function () {var jsonData = pm.response.json();pm.expect(jsonData[0].name).to.eql("doggie");
});

var jsonData 是定义了一个变量,然后把响应数据经过 JSON 格式化之后,赋值给了定义好的变量。然后用 expect 这个方法,把响应数据中的 url 这个 key 中的值提取出来,用 eql 这个方法去和括号中的字符串做比较,如果这两个值是一致的,返回 true,如果不一致就返回 false

  • 验证响应体是否与某个字符串完全相同Response Body:Is equal to a string
pm.test("Body is correct", function () {pm.response.to.have.body("response_body_string");
});

这是一个全量的断言,把响应的数据和一个确定的字符串去做比较,如果完全相同返回 true,不完全相同返回 false

  • 验证响应头信息中的 Content-Type 是否存在Response Body:Content-Type header check
pm.test("Content-Type is present", function () {pm.response.to.have.header("Content-Type");
});

这个断言可以用来测试响应的头信息中是否包含某个字段,Content-type 可以换位其他的字段

  • 验证响应时间是否小于某个值Response time is less than 200ms
pm.test("Response time is less than 200ms", function () {pm.expect(pm.response.responseTime).to.be.below(200);
});

可以用来判断响应的时间是否超过了某一个值,预设的是 200ms,如果没有超过返回 true,超过预设的值返回 false

2.4 Postman 完成接口测试

  • 创建测试集
  • 编写断言
  • 运行测试集
  • 查看测试结果

2.4.1 创建测试集

  • 选择左侧边栏的 Collecions,点击 + 进入新建 collection 界面,命名为【宠物商店】

  • 现在的这四个接口是对宠物的操作,所以可以在 collection 中再创建一层文件夹,点击 Add folder,命名为【宠物】


2.4.2 查询宠物接口

  • 命名:查询宠物
  • 请求方法:保持 GET 不变
  • 请求 URL:
  • 请求参数:GET 请求参数要在 Params 中设置,status=available

2.4.3 新增宠物接口

  • 命名:新增宠物
  • 请求方法:换为 POST
  • 请求 URL:
  • 请求参数:POST 请求的参数需要放在 body – raw 中,这里的请求参数格式为 JSON

注意: id 具有唯一性需要进行修改

{"id": 9223372000001083222,"category": {"id": 1,"name": "cat"},"name": "miao","photoUrls": ["string"],"tags": [{"id": 5,"name": "cute"}],"status": "available"
}

  • 完成断言的编写

pm.test("响应状态码为 200", function () {pm.response.to.have.status(200);
});pm.test("响应体正确", function () {pm.response.to.have.body("{"id":9223372000001083222,"category":{"id":1,"name":"cat"},"name":"miao","photoUrls":["string"],"tags":[{"id":5,"name":"cute"}],"status":"available"}");
});

2.4.4 更新宠物接口

  • 命名:更新宠物信息
  • 请求方法:换为 PUT
  • 请求 URL:
  • 请求参数:POST 请求的参数需要放在 body – raw 中,这里的请求参数格式为 JSON

比如修改宠物姓名:

{"id": 9223372000001083333,"category": {"id": 1,"name": "cat"},"name": "小黑","photoUrls": ["string"],"tags": [{"id": 5,"name": "cute"}],"status": "available"
}
  • 添加断言
pm.test("响应状态码为 200", function () {pm.response.to.have.status(200);
});pm.test("响应体正确", function () {pm.response.to.have.body("{"id":9223372000001083333,"category":{"id":1,"name":"cat"},"name":"小黑","photoUrls":["string"],"tags":[{"id":5,"name":"cute"}],"status":"available"}");
});

2.4.5 删除宠物接口

  • 命名:删除宠物
  • 请求方法:换为 DELETE
  • 请求 URL:
  • 请求参数:宠物 id,直接跟在 URL
https://petstore.swagger.io/v2/pet/9223372000001083333
  • 添加断言 这里重点断言业务错误码 codemessage 这两个字段的值就可以。
pm.test("响应状态码为 200", function () {pm.response.to.have.status(200);
});pm.test("业务错误码为 200", function () {var jsonData = pm.response.json();pm.expect(jsonData.code).to.eql(200);
});pm.test("message 为删除的宠物 id", function () {var jsonData = pm.response.json();pm.expect(jsonData.message).to.eql("9223372000001083222");
});

2.4.6 运行测试集

对于 collection 来说,每一级的目录都可以单独运行。比如现在只想要运行宠物操作相关用例,那么就可以点击宠物,进入宠物 folder 页面。

  • 点击 Run 按钮进入 collection 执行页面


  • 可以选择要执行的 collection,选择环境变量、选择执行次数、选择延迟时间,选择测试数据(做数据驱动)
  • 点击 Run 按钮即可开始执行

2.4.7 查看测试结果

运行完毕后会进入测试结果页面,就可以查看测试结果了

2.4.8 变量

  • Data:在测试集中上传的数据
  • Environment:环境范围
  • Collection:集合范围
  • Global:全局范围
  • Local:在脚本中设置的变量

变量定义

Postman 的变量主要用于参数化和关联,常用变量可以按使用范围设置。

Local

Local 级别的变量其实就是在脚本中定义的变量,比如删除宠物信息用例中,断言里使用了检验 JSON 格式中某个 key 的值

这里面的 jsonData 就是一个 Local 级别的变量。它只在这条断言中生效。

Global

如果是大部分的接口都会用到的变量,可以设置为全局变量,这样的话 Postman 中的所有接口都可以直接调用。

点击左侧的 Environments,点击 Globals 进入全局变量设置界面。

在这里可以设置变量

  • VARIAVLE: 变量名
  • INITIAL VALUE: 共享初始值, 用于团队共享时供别人使用的默认值
  • CURRENT VALUE: 当前值, 自己当前使用的变量值 (一般我们只用设置这个值即可)
  • Perisit All: 保持所有, 将当前自己使用的值 (CURRENT VALUE) 替换所有的初始值
  • Reset All: 重置所有, 将当前所有的 CURRENT VALUE 重置为与当前初始值一样

这里我们设置一个全局变量名为 statusINITIAL VALUE 设置为 available,然后点击 sava 保存设置

现在一个全局变量已经设置好了。

在 Postman 中的使用为 {{ 变量名 }},当 Postman 解析变量时,字符串 {{ 变量名 }} 会被替换为相应的值。

比如进入查询宠物接口,这时候就可以把 status 的值替换为全局变量。

除了手动设置之外,还可以通过脚本的方式设置。

一般设置变量会在请求之前,可以在 Pre-request Script 当中来完成。

Postman 已经给我封装好了现成的设置和获取全局变量的脚本,可以直接使用。

  • 进入查询宠物接口
  • Pre-request Script 当中点击 Set a global variable
pm.globals.set("status", "sold");

这样设置就相当于在请求之前,先把全局变量 status 的值设置为了 sold,所以请求的结果也是返回的 sold 状态的宠物信息。

现在再看下 Globals 当中,status 现在的值

这就说明请求前使用脚本设置全局变量是成功的。

那如果需要在脚本当中获取全局变量的值应该怎么办

比如现在要在脚本中获取 status 这个全局变量的值,并且打印在控制台。

var status = pm.globals.get("status");console.log(status)

点击 Postman 下方的 Console 按钮,就可以打开 Postman 中的控制台,这里就可以看到所有的 log 日志

Collection

如果是某一个测试集中的接口会用到的变量,可以设置为测试集变量。

比如点击 Collections 中的宠物商店,可以看到在测试集当中也可以设置鉴权方式,请求前脚本,测试脚本和变量。

点击 Variables,就可以设置对应的测试集变量。

注意,宠物商店的下一级,宠物 folder 只可以设置鉴权方式和脚本,变量是不可以设置的。

回到宠物商店的变量设置页面。

前面的宠物操作都涉及到了宠物 id 的值,可以把宠物 id 设置为测试集变量。

设置好之后,新增宠物、更新宠物和删除宠物接口中的宠物 id 就都可以引用这个测试集变量。

  • 新增宠物

对应的断言也得做修改

首先要先获取到这个测试集变量,然后再把变量值拼接到预期结果当中就可以了。

var petId = pm.collectionVariables.get("petId");pm.test("响应体正确", function () {pm.response.to.have.body("{"id":" + petId + ","category":{"id":1,"name":"cat"},"name":"miao","photoUrls":["string"],"tags":[{"id":5,"name":"cute"}],"status":"available"}");
});pm.test("Body matches string", function () {pm.expect(pm.response.text()).to.include("{"id":" + petId + ","category":{"id":1,"name":"cat"},"name":"miao","photoUrls":["string"],"tags":[{"id":5,"name":"cute"}],"status":"available"}");
});

  • 更新宠物信息接口

修改断言,思路和新增宠物的一致。

var petId = pm.collectionVariables.get("petId");pm.test("响应状态码为 200", function () {pm.response.to.have.status(200);
});pm.test("响应体正确", function () {pm.response.to.have.body("{"id":" + petId + ","category":{"id":1,"name":"cat"},"name":"小黑","photoUrls":["string"],"tags":[{"id":5,"name":"cute"}],"status":"available"}");
});
  • 删除宠物

修改断言

var petId = pm.collectionVariables.get("petId");pm.test("message 为删除的宠物 id", function () {var jsonData = pm.response.json();pm.expect(jsonData.message).to.eql(petId);
});

Enviroment

怎么设置和使用环境变量。

环境变量一般来说是用来切换不同测试环的境。

比如一套接口要在不同的环境上测试时, 可以新建两个环境,比如 test 环境和 stage 环境, 两个环境中添加 base_url 变量并设置不同的值, 请求中接口的url中使用 {{ base_url }}, 这样只需在 Postman 中切换环境就可以测试不同的环境。

现在先创建一个 test 环境。

左侧边栏点击 Environments,点击 + 进入创建新环境的界面。

  • 命名:测试环境
  • 变量名:baseURL
  • 初始值:https://petstore.swagger.io/v2

选择测试环境

然后四个接口就可以修改一下 url 的设置了。

  • 查询宠物:{{ baseURL }}/pet/findByStatus?status={{ status }}
  • 新增宠物:{{ baseURL }}/pet
  • 更新宠物:{{ baseURL }}/pet
  • 删除宠物:{{ baseURL }}/pet/{{ petId }}

修改完毕之后,记得保存设置。然后再次运行测试集。

Data

data 级别的就是在测试集中导入数据,通过数据驱动的方式完成测试。

变量的优先级

当变量重名的时候,优先级从高至低为:DataEnviromentCollectionGlobalLocal

在这里插入图片描述

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

相关文章:

软件测试学习笔记丨Postman实战练习

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32096#h-22 二、实战练习 2.1 宠物商店接口文档分析 接口文档:http://petstore.swagger.io ,这是宠物商店接口的 swagger 文档。 2.1.1 什么是 swagger Swagger 是…...

kubernetes微服务基础及类型

目录 1 什么是微服务 2 微服务的类型 3 ipvs模式 ipvs模式配置方式 4 微服务类型详解 4.1 ClusterIP 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 metalLB配合loadbalance实现发布IP 1 什么是微服务 用控制器来完成集群的工作负载,那么应用如何暴漏出去&…...

linux-L3_linux 查看进程(node-red)

linux 查看进程 以查看进程node-red为例 ps aux | grep node-red...

区块链之变:揭秘Web3对互联网的改变

传统游戏中,玩家的虚拟资产(如角色、装备)通常由游戏公司控制,玩家无法真正拥有这些资产或进行交易。而在区块链游戏中,虚拟资产通过去中心化技术记录在区块链上,玩家对其拥有完全的所有权,并能…...

SAP B1 Web Client MS Teams App集成连载一:先决条件/Prerequisites

一、先决条件/Prerequisites 在设置 SAP Business One 应用之前,确保您已具备以下各项:Before you set up the SAP Business One app, make sure you have acquired the following: 1.Microsoft Teams 管理员账户/A Microsoft Teams admin account 您需…...

去除单细胞数据中环境游离的RNA污染-decontX工具学习

DecontX 是一种用于单细胞 RNA 测序数据的去除环境污染物(decontamination)的工具,主要用于减少由细胞外RNA造成的污染效应。 开发者在20年的文章中已经把这个工具适用的情况说的非常清楚了:简单来说就是基于微流控的单细胞技术会…...

Games101图形学笔记——光栅化

这里写目录标题 Rasterization光栅化屏幕空间隔行扫描三角形采样采样产生的问题反走样处理方法:采样前模糊 频率,时域傅里叶级数展开傅里叶变换 滤波高通滤波低通滤波 卷积卷积的一些定理 反走样MSAA(Multisample Anti-Aliasing)多…...

2024年汉字小达人区级自由报名的几个最新问题和真题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛,还有不到两周。 今天继续回答家长和孩子们的几个问题,并给大家看看一些真题,让孩子对汉字小达人的题型和比赛有直观的了解,从而更好地备考。 本专题在比赛前持续更…...

从简单分析到智能问数,Smartbi AIChat让数据回归业务

大数据产业创新服务媒体 ——聚焦数据 改变商业 在某科技公司,资深数据分析师李晨(化名)正忙于分析新产品的市场表现。面对传统自助式BI工具,李晨在功能界面中手动设置各种查询条件,进行了一番复杂的拖拉拽操作&#…...

基于SpringBoot+Vue+MySQL的考编论坛网站

系统展示 用户前台界面 管理员后台界面 系统背景 在当前信息化高速发展的时代,考编已成为众多求职者的重要选择。然而,备考过程中信息获取、经验交流及资源分享的需求日益凸显。基于SpringBoot、Vue.js与MySQL构建的考编论坛网站应运而生,旨在…...

SpringSecurity剖析

1、SpringSecurity 入门 1.1、简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Sp…...

一文搞懂 Flink Graph 构建过程源码

一文搞懂 Flink Graph 构建过程 1. StreamGraph构建过程1.1 transform(): 构建的核心1.2 transformOneInputTransform1.3 构造顶点1.4 构造边1.5 transformSource1.6 transformPartition1.7 transformSink 1. StreamGraph构建过程 链接: 一文搞懂 Flink 其他重要源码点击我 e…...

【spring】IDEA 新建一个spring boot 项目

参考新建项目-sprintboot 选择版本、依赖,我选了一堆 maven会重新下载一次么?...

LeetCode[简单] 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路:类似与二分查找 唯一需要注意的是,搜索…...

(代码可运行)Bootstrap框架的HTML示例

Bootstrap&#xff1a;一套流行的前端开发框架&#xff0c;基于HTML、CSS和JavaScript&#xff0c;适用于快速构建响应式Web应用。 以下是一个使用Bootstrap构建的简单响应式Web应用的HTML示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head&…...

IntelliJ IDEA 2024创建Java项目

一、前言 本文将带领大家手把手创建纯Java项目&#xff0c;不涉及Maven。如有问题&#xff0c;欢迎大家在评论区指正说明&#xff01; 二、环境准备 名称版本jdk1.8idea2024 1.4操作系统win10 jdk的安装教程 idea的安装教程 三、创建项目 首先我们点击新建项目 然后我们…...

Python之 条件与循环(Python‘s Conditions and loops)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

C++学习,多态纯虚函数

多态字面意思是多种形态&#xff0c;当类之间存在层次结构&#xff0c;并且类之间是通过继承时&#xff0c;就会用到多态。多态允许通过基类指针或引用来调用派生类中的成员函数。这种机制允许函数&#xff0c;在运行时根据对象的实际类型来确定执行哪个函数&#xff0c;从而实…...

飞速(FS)与西门子联合打造交换机自动化灌装测试生产线

2024年9月&#xff0c;备受信赖的信息通信技术&#xff08;ICT&#xff09;解决方案提供商飞速&#xff08;FS&#xff09;与工业自动化领域的领先企业西门子公司正式宣布&#xff0c;双方共同打造的ILTP&#xff08;智能灌装测试平台&#xff09;和自动化生产线将正式启动。此…...

Vue组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…...

Redis底层数据结构(详细篇)

Redis底层数据结构 一、常见数据结构的底层数据结构1、动态字符串SDS&#xff08;Simple Dynamic String&#xff09;组成 2、IntSet组成如何保证动态如何确保有序呢? 底层如何查找的呢? 3、Dict(dictionary)3.1组成3.2 扩容3.3 收缩3.4 rehash 4、ZipList连锁更新问题总结特…...

树和二叉树基本术语、性质

总结二叉树的度、树高、结点数等属性之间的关系&#xff08;通过王道书 5.2.3 课后小题来复习“二叉 树的性质”&#xff09; 树的相关知识 叶子结点的度0 层次默认从1开始 有些题目从0 开始也不要奇怪 常见考点1&#xff1a;结点数总度数&#xff0b;1 常见考点2&#xff1…...

FEDERATED引擎

入门 MySQL引擎主要有以下几种&#xff1a; MyISAM&#xff1a;这是MySQL 5.5.5之前的默认存储引擎&#xff0c;不支持事务、外键约束和聚簇索引&#xff0c;适用于读多写少的场景。InnoDB&#xff1a;这是MySQL 5.5.5之后的默认存储引擎&#xff0c;支持事务、外键约束、行级…...

Android NDK工具

Android NDK工具 Android NDK Crash 日志抓取及定位 NDK-STACK 定位 NDK Crash 位置 只要执行如下代码就行&#xff1a; adb logcat | ndk-stack -sym /yourProjectPath/obj/local/armeabi-v7aPS: 必须是带symbols的so&#xff0c;也就是在’\app\src\main\obj\local\下面的…...

使用 Docker 进入容器并运行命令的详细指南

Docker 是一款开源的容器化平台&#xff0c;它可以将应用程序和依赖环境打包到一个可移植的“容器”中&#xff0c;以保证应用不受运行环境的影响。使用 Docker 容器化应用后&#xff0c;有时需要进入容器内部执行一些命令进行调试或管理。 一、Docker 基础命令 在开始进入容…...

【人工智能】OpenAI最新发布的o1-preview模型,和GPT-4o到底哪个更强?最新分析结果就在这里!

在人工智能的快速发展中&#xff0c;OpenAI的每一次新模型发布都引发了广泛的关注与讨论。2023年9月13日&#xff0c;OpenAI正式推出了名为o1的新模型&#xff0c;这一模型不仅是其系列“推理”模型中的首个代表&#xff0c;更是朝着类人人工智能迈进的重要一步。本文将综合分析…...

Spring Boot-版本兼容性问题

Spring Boot 版本兼容性问题探讨 Spring Boot 是一个用于构建微服务和现代 Java 应用的流行框架&#xff0c;随着 Spring Boot 版本的更新和发展&#xff0c;它在功能、性能和安全性上不断提升。但与此同时&#xff0c;Spring Boot 的版本兼容性问题也逐渐成为开发者必须关注的…...

Java原生HttpURLConnection实现Get、Post、Put和Delete请求完整工具类分享

这里博主纯手写了一个完整的 HTTP 请求工具类,该工具类支持多种请求方法,包括 GET、POST、PUT 和 DELETE,并且可以选择性地使用身份验证 token。亲测可用,大家可以直接复制并使用这段代码,以便在自己的项目中快速实现 HTTP 请求的功能。 目录 一、完整代码 二、调用示例…...

如何微调(Fine-tuning)大语言模型?

本文介绍了微调的基本概念&#xff0c;以及如何对语言模型进行微调。 从 GPT3 到 ChatGPT、从GPT4 到 GitHub copilot的过程&#xff0c;微调在其中扮演了重要角色。什么是微调&#xff08;fine-tuning&#xff09;&#xff1f;微调能解决什么问题&#xff1f;什么是 LoRA&…...

wopop靶场漏洞挖掘练习

1、SQL注入漏洞 1、在搜索框输入-1 union select 1,2,3# 2、输入-1 union select 1,2,database()# &#xff0c;可以得出数据库名 3、输入-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schematest#&#xff0c;可以得出数据库中…...