科普文:一文搞懂Postman
1. 概叙
1.1 Postman简介
Postman是一款强大的接口测试工具,主要用于测试HTTP请求,支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等,并且提供了丰富的功能来模拟和测试各种网络请求。
Postman官网上这样介绍它:"Manage all of your organization's APIs in Postman, with the industry's most complete API development environment."看的出来Postman是功能强大的API测试的工具
Postman 提供功能强大的 Web API 和 HTTP 请求的调试,它能够发送任何类型的HTTP 请求 (GET, POST, PUT, DELETE...),并且能附带任何数量的参数和 Headers。不仅如此,它还提供测试数据和环境配置数据的导入导出,付费的 Post Cloud 用户还能够创建自己的 Team Library 用来团队协作式的测试,并能够将自己的测试收藏夹和用例数据分享给团队。
1.2 Postman功能特性说明
可参考:postman接口测试工具详解【全】_postman工具-CSDN博客
Postman的主要功能和特点包括:
- 支持各种HTTP请求方法:Postman支持HTTP协议的所有请求方式,包括GET、POST、HEAD、PUT、DELETE等,满足各种测试需求。
- 请求参数设置:可以设置请求的URL参数、请求头、请求体等,支持表单格式和JSON格式的数据发送。
- 模拟登录和Cookies管理:可以模拟登录过程,保存登录后的Cookies,以便在后续的请求中使用。
- 数据同步和团队协作:支持数据同步功能,可以在不同设备上同步测试数据;支持团队协作,可以推送请求给团队成员执行或继续开发。
- 接口开发和测试全流程支持:从接口开发到测试,再到模拟测试和监控,Postman提供了全面的支持。
- 内置脚本和测试自动化:支持编写内置脚本进行接口测试自动化,提高测试效率。
使用Postman进行接口测试的基本步骤包括:
- 创建请求:在Postman中创建一个新的请求,设置请求方法、URL、请求头和请求体。
- 发送请求:根据需要设置的各种参数,发送HTTP请求。
- 查看响应:查看服务器的响应,包括状态码、响应体等。
- 测试和验证:使用内置的测试脚本对响应进行验证,确保接口按照预期工作。
- 数据同步和团队协作:利用Postman的同步功能,确保团队成员使用最新数据;通过分享请求,让团队成员继续执行或修改。
Postman还支持JSON格式的数据发送和接收,这对于处理结构化数据非常有用。此外,Postman还提供了丰富的文档和教程,帮助用户快速上手和使用这款工具。
1.3 Postman下载及安装
Postman有2种安装方式,一种是作为Chrome的插件,另一种是客户端形式,建议使用客户端安装
1. Postman下载
官网下载地址
:https://www.getpostman.com/downloads/
2. 安装过程
默认安装即可,安装完成后,注册登录
2. Postman详细操作说明
2.1 Postman功能视图
详细功能可以参考Postman官方 文档,
打开软件,就可以看到Postman主界面,如下图所示17个功能菜单和说明:
1. Collections:在Postman中,Collection类似文件夹,可以把同一个项目的请求放在一个Collection里方便管理和分享,Collection里面也可以再建文件夹。如果做API文档的话,可以每个API对应一条请求,如果要把各种输入都测到的话,就需要每条测试一条请求了。
2. 上面的黑字注册是请求的名字,如果有Request description的话会显示在这下面。下面的蓝字是保存起来的请求结果,点击可以载入某次请求的参数和返回值。我会用这个功能给做客户端的同事展示不同情况下的各种返回值。保存请求的按钮在15.
3. 选择HTTP Method的地方,各种常见的不常见的非常全。
4. 请求URL,两层大括号表示这是一个环境变量,可以在16的位置选择当前的environment,环境变量就会被替换成该environment里variable的值。
5. 点击可以设置URL参数的key和value
6. 点击发送请求
7. 点击保存请求到Collection,如果要另存为的话,可以点击右边的下箭头
8. 设置鉴权参数,可以用OAuth之类的
9. 自定义HTTP Header,有些因为Chrome原因不能自定义的需要另外装一个插件Interceptor,在16上面一行的卫星那里
10. 设置Request body,13那里显示的就是body的内容
11. 在发起请求之前执行的脚本,例如request body里的那两个random变量,就是每次请求之前临时生成的。
12. 在收到response之后执行的测试,测试的结果会显示在17的位置
13. 有四种形式可以选择,form-data主要用于上传文件。x-www-form-urlencoded是表单常用的格式。raw可以用来上传JSON数据
14. 返回数据的格式,Pretty可以看到格式化后的JSON,Raw就是未经处理的数据,Preview可以预览HTML页面
15. 点击这里把请求保存到2的位置
16. 设置environment variables和global variables,点击右边的x可以快速查看当前的变量。
17. 测试执行的结果,一共几个测试,通过几个。
2.2 测试工具
测试工具主要包括三部分,在发起请求之前运行的Pre-request,在收到应答之后运行的Test,和一次运行所有请求的Collection Runner.
1. Pre-request
预请求脚本是与在发送请求之前执行的收集请求相关联的代码片段。
Pre-request和Test用的语言都是JavaScript,Postman在一个沙盒里执行代码,提供给用户的库和函数可以在这里查看。而常用的功能都可以通过右边的Code Snippets实现,点击就可以插入到代码区域。
2. Test测试
使用Postman,您可以使用JavaScript语言为每个请求编写和运行测试.
测试例子
设置环境变量
pm.environment.set("variable_key", "variable_value");
获取环境变量
pm.environment.get("variable_key");
获取环境变量(其值是字符串化对象)
var array = JSON.parse(pm.environment.get("array"));var obj = JSON.parse(pm.environment.get("obj"));
清除环境变量
pm.environment.unset("variable_key");
设置全局变量
pm.globals.set("variable_key", "variable_value");
获取全局变量
pm.globals.get("variable_key");
清除全局变量
pm.globals.unset("variable_key");
得到一个变量
此函数在全局变量和活动环境中搜索变量。
pm.variables.get("variable_key");
检查响应主体是否包含字符串
pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search");});
检查响应主体是否等于字符串
pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string");});
检查JSON值
pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100);});//var jsonData = JSON.parse(responseBody);//tests["list"] = jsonData["lists"][0] == "11";
内容类型存在
pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type");});
响应时间小于200毫秒
pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200);});
代码名称包含一个字符串
pm.test("Status code name has string", function () { pm.response.to.have.status("Created");});
成功的POST请求状态代码
pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201,202]);});
将XML主体转换为JSON对象
var jsonObject = xml2Json(responseBody);
获取HTML并取出其中的值
//获取HTMLconst $ = cheerio.load(responseBody);//获取input标签中name属性值为SignValue的数据中属性为value的值var signvalue=$('input[name=SignValue]').attr('value');获取textarea标签中name值为SignValue的数据中文本属性text的值var signvalue=$('textarea[name=SignValue]').text();
3. Collection Runner
当编写了很多测试之后,就可以使用Collection Runner来自动运行整个Collection了,入口就在主界面最上面一行的Runner。选好Collection、Environment,如果有需要还可以载入JSON和CSV作为数据源。点击Start Run,就可以看到结果了。
runner是postman中执行collection集合中请求的一种用法,可以调整执行的顺序和用例的数量。
可以记录执行结果及导出结果报告(json格式的报告)。
运行测试集合
选择一个测试集合,启动运行器。
参数化(数据驱动测试)
1)json文件数据驱动
创建json文件,并设置数据:
使用文件中的键名参数化postman正文数据值。
断言也需要进行参数化:
使用Runner运行器,导入、并查看数据文件
因为有四条数据,迭代次数就默认给设置成了4次。
它会每次迭代从文件中读取一行数据进行参数化,并允许。
直到四次迭代结束,数据使用完毕。
做好设置,保存响应结果,点击运行集合。
2)csv文件数据驱动
后续操作过程见json数据驱动过程。
4. newman插件的使用
newman是postman的插件,是用于命令行运行测试集合的一个插件。
1、安装
先安装nodejs,通过npm -v验证
最好安装16版本以上。
如果出现安装进度慢,默认镜像源(软件所在的服务器)在国外,可以更新到国内的镜像源服务器上去。
npm config set registry http://registry.npm.taobao.org
2、使用newman运行collection
前提准备:
- 测试集合文件,是通过postman导出的json文件。
- 环境变量文件,是需要通过postman导出的json文件。
- 数据驱动文件:data.json、data.csv
1) 只运行一个collection集合(不涉及到环境变量、不涉及参数化)
导出集合文件为:zhuluoji_collection.json
就可以使用newman运行这个集合文件了:
格式: newman run 集合文件的全路径
2) 指定迭代次数 : -n
newman run e:\zhuluoji_collection.json -n 2
3) 指定局部环境变量:-e
导出environment环境变量文件。
newman run e:\zhuluoji_collection.json -e e:\BaiDuTrans_environment.json -n 2
4) 指定全局环境变量:-g
导出globals环境变量文件:
newman run e:\BaiDuTrans_collection.json -e e:\BaiDuTrans_environment.json -g e:\globals.json -n 1
5) 指定参数化文件的:-d
可以支持json和csv文件进行参数化的。
newman run e:\MiFeng_collection.json -d e:\data.json
newman run e:\MiFeng_collection.json -d e:\data.csv
3、生成报告
1) cli过格式报告
在cmd下运行的结果报告的展示形似。
2) json格式报告
-r json : 指定输出报告的格式是json格式。
newman run e:\MiFeng_collection.json -d e:\data.csv -r json --reporter-json-export e:\data\result1212.json
3) html格式报告
-r html : 指定输出报告的格式为html格式
newman run e:\MiFeng_collection.json -d e:\data.csv -r html --reporter-html-export e:\data\result1212.html
但是html格式输出,需要安装插件才能使用。
npm install -g newman-reporter-html
4) 集成命令到批处理文件中(bat文件)
创建一个txt文件,重命名为run.bat文件,将其编码改为utf-8,将上面可执行的newman命令复制到该文件即可。
保存后,双击该文件运行。
4、newman+jenkins集成做定时任务
1、配置jenkins支持newman的环境变量
需要配置newman和node的路径,通过where命令来获取。
可参考:Postman接口测试工具最全实用教程
2.3 变化的参数
1. 使用变量
现在使用参数都是写死的, 那么如果想要测试账号密码参数使用其它值有没有异常怎么办呢?
这里就需要使用变量
引用变量的语法:{{变量名}}
Pre-request Script 和 Tests都可以设置变量,区别在于:Pre-request Script 中的脚本是在执行请求之前运行,而Tests 中的脚本则是在请求完成之后执行。
2. 测试数据集
在执行Collection Runner时可以选择CSV或json格式的文件作为测试数据集
CSV文件格式:
JSON文件格式:
在执行Collection Runner时使用CSV/JSON文件
3. 定期任务
Postman 提供了一个 Monitors (监视器)功能,支持我们提交一个测试任务,按照设置的定时器进行运行,如每小时测试一次,具体操作如下:
2.4 接口依赖的问题
1. 接口执行顺序
首先,说明一下,接下来说的接口都是默认属于同一个集合 (Collections) 中的。
接口的执行顺序其实就是按照这边目录中的顺序(从上到下);所以有了这个默认的执行顺序后,那么我们便可以把需要优先执行的接口放前面即可,比如把“登录接口”放在第一个。
2. 自定义执行顺序
当然,如果只有默认的一个执行顺序的话,通常没法满足我们复杂的业务需求,所以 Postman 为我们提供了一个函数:postman.setNextRequest("填写你要跳转的接口名")
我们可以在接口的 Tests 功能区中执行跳转代码,如:
这里需要注意几点:
- postman.setNextRequest() 只在运行集合测试的时候生效,也就是说我们单独运行 (Send) 接口 时,函数是不起作用的。
- 当我们运行集合测试成功从 Request1 -> Request3 后,如果 Request3 后面还有接口,那么后面的接口仍然继续按默认顺序执行,即图中的接口 Request4 仍会被执行。
- 指定的跳转接口必须属于同一个集合中。
- setNextRequest() 函数不管在 Tests 脚本中何处被调用,它都只在当前脚本最后才被真正执行。比如我们将图中的第二行与第一行互调后,那么在运行跳转函数后第二行代码仍会被执行。
3. 解决依赖的思路
- 保证 Request1 在 Request3 之前被运行
- 将 Request1 返回的 access_token 的值添加到环境变量"参数集"中。
- Request3 在请求时引用 access_token 的值
2.5 预处理和断言
这两个模块采用的是js语法脚本。
1、预处理 -pre-request script模块
在当前请求发送之前要处理的脚本,我们能做点什么事情?
用于处理请求数据(获取、设置、加密等)
在发送当前请求之前发送另外一个请求(OA的登录和上传图片)。
1)发送一个get请求
2)获取参数(全局环境、局部环境、集合变量)
3)修改、设置参数(掌握)
4)发送一个post类型的请求
//发一次登录请求??
//是在OALoadImage前要处理的脚本
//实现发送一个post请求
var postInfo = {"url":"http://xxxx/MiFengOA/index.php?a=check&m=login&d=&ajaxbool=true&rnd=607798","method":"post","body":{"mode":"urlencoded","urlencoded":"rempass=0&jmpass=false&device=1650464000397<ype=0&adminuser=YWRtaW4:&adminpass=YTg5ODM5ODM:&yanzm="}
}
pm.sendRequest(postInfo, function (err, response) {//如果响应正文是json格式的,就可以response.json()输出响应正文//如果响应正文是不是json格式的,就输出字符粗格式:response.text()console.log(response.json());
});
2、断言-tests
在当前请求发送之后要处理的脚本,是作为断言来使用的。
发送完当前请求之后,对响应的结果进行判断、断言
断言的内容可以是:响应正文、响应状态码、响应头部的字段呢?响应时间等
响应正文断言:包含子字符串(掌握)和json断言(掌握)
其他断言方式了解:响应状态码断言、响应时间断言等
//实现断言,是在当前请求发送完成之后,得到响应结果才能进行的。//1、判断响应状态码是否符合预期,并不能完全确定业务是否是正确的
pm.test("响应状态码是200?", function () {//实现判断语法//pm.response: http的响应报文(四大组成部分)// to.have.status(200):是否包含状态码200呢?pm.response.to.have.status(200);
});
//了解就行
tests["响应状态码是否为200?"] = responseCode.code === 200;
// 2、响应正文做断言(重点掌握)
// 以字符串格式的正文形式断言(都行)
// 大串(实际结果)包小串(预期结果)。
// pm.response.text():将响应报文中的正文部分转化为字符串格式
pm.test("大串包小串??", function () {pm.expect(pm.response.text()).to.include("用户名不符合格式要求");
});//responseBody :获取的是响应正文
tests["响应正文包括指定字符串?"] = responseBody.has("用户名不符合格式要求");// 以json格式的正文进行i断言(响应报文头部的content-type为json的可以用)
//直接使用json断言
pm.test("Your test name", function () {var jsonData = pm.response.json();console.log(jsonData.trans_result[0].dst)pm.expect(jsonData.trans_result[0].dst).to.eql("苹果");
});//响应时间:从发出请求,到接收到响应结果的时间差就是响应时间,是接口的一个性能指标
// 假设要求,该请求响应时间不应该高于200ms
pm.test("响应时间的判断:", function () {//pm.response.responseTime:实际的响应时间// to.be.below:低于某个指定的值pm.expect(pm.response.responseTime).to.be.below(400);
});
2.6 使用postman进行HTTP接口测试
详细功能可以参考:Postman接口测试工具最全实用教程
1、get请求
get请求不需要有请求的正文数据的,其他都要(url和请求方式必须,可选的是头部字段)。
1)百度翻译接口 自己再去做一遍即可。
请求地址:
url:https://fanyi-api.baidu.com/api/trans/vip/translate
请求方式:get
params:q=apple&from=auto&to=zh&appid=xxxxx&salt=888888&sign=a9adc2d687fbacecc3b5059b9ccedc95
2)B站视频最新评论接口
url:https://api.bilibili.com/x/v2/reply/main
请求方式:get
params: callback=jQuery17207775567550413909_1655259544202&jsonp=jsonp&next=0&type=1&oid=248143527&mode=2&plat=1&_=1655259574655
在postman中实现上述的参数,形成参数用例(直接报错,触发防盗链功能):
视频类的网站都有一个防盗链功能,就算抓到了请求的基本参数,你也不能通过工具获取评论的参数,其实是通过一个头部字段进行的限制,这个字段就起到了防盗链的作用。
referer:一般只是当前视频所在的地址,用它做防盗链的作用,必须指定referer,而且referer的值和当前视频的地址一致,你才有权限获取评论信息。
至于使用哪一个字段来做防盗链,开发设计的,只不过使用referer的居多。
解决方法:
postman的header标签下,添加一个头字段referer(可以抓包获取)。
2、post请求--x-www-form-urlencoded
除了get所需的所有参数(请求方式、请求地址、请求头部等),还需要请求正文数据。
1)百度翻译
使用post请求实现百度翻译功能,content-type一定是x-www-form-urlencoded
https://fanyi-api.baidu.com/api/trans/vip/translate?q=apple&from=auto&to=zh&appid=xxxxxx&salt=888888&sign=a9adc2d687fbacecc3b5059b9ccedc95
请求地址:
https://fanyi-api.baidu.com/api/trans/vip/translate
请求类型:post
请求正文:
- q:apple
- from:auto
- to:zh
- appid:xxxxx
- salt:888888
- sign:a9adc2d687fbacecc3b5059b9ccedc95
- 请求头部:content-type:x-www-form-urlencoded
2) 电商前台的注册接口
特点是post请求,content-type要求是以x-www-form-urlencoded。
请求的地址:
http://xxxxx/qftest/index.php?c=user&a=register&step=submit
请求的方式:post
请求的参数:拼接在地址栏了
请求的数据:
- username: 给一个已注册的数据、空、4位、数字开头、正常未注册等
- password
- repassword
- agree
请求的头部:content-type:application/x-www-form-urlencoded
3)电商登录接口
请求地址:
http://xxxxx/qftest/user/login.html?step=submit
请求方式: post
请求正文:
- username:bk2201_00001
- password:200c6d94e583e62c6964de3acdc723e5
请求头部:content-type:application/x-www-form-urlencoded
3、post请求--form-data
content-type类型位form-data,数据传输仍然是键值对,数据类型可以是文件(word、excel、图片、视频等)。
1)蜜锋OA系统登录功能--urlencoded
请求url:
http://xxxxx/MiFengOA/index.php?a=check&m=login&d=&ajaxbool=true&rnd=607798
请求方式:post
请求的数据:
请求头部:content-type: x-www-form-urlencoded
2)蜜锋OA系统上传图片的功能--form-data
只有登录成功之后才能够上传图片,登录失败(没有登录)不能上传。
请求地址:
http://xxxxx/MiFengOA/index.php?a=upfile&m=upload&d=public&maxsize=80&uptype=image&thumbnail=150x150&ajaxbool=true&rnd=322198
请求方式:post
请求数据:file: (binary)
请求头部:content-type:multipart/form-data
3) 多接口的实现-cookie的使用
cookie作为一种鉴权的方式,登录某个系统之后,再次访问系统的不同页面,都能保持登录状态,就是因为后续的所有请求都携带了cookie的参数。
第一次登录成功,postman或者浏览器,可以将登录所用的用户名及密码等记录在本地。
再在访问其他接口的时候,浏览器发出的请求就会自动化从cookie管理器中携带和当前主机相关的cookie及值,这样就一直保持了登录状态。
在postman中的两个请求,登录和上传签名。
如果希望通过postman的cookie管理器,来共享cookie值,就可以调整他俩的现后执行顺序即可,先登录再上传即可,每次都能动态获取最新的cookie值,一般不会出错。
如果不想使用cookie管理器,不想先登录怎么办,只能手动给上传接口添加一个cookie参数,应为cookie是有时效性的,过一段时间就不能用了。
4、post请求-content-type:application/json
json数据结构作为请求的正文数据及响应正文数据是最常见的用法,将来大家接触的80%都是这种格式的。
将来项目中json数据会更复杂、内容会更多,上百行数据都很正常。
住逻辑的登录的接口来演示。
请求地址:
https://xxx/designer_api/account/login_quick
请求的方式:post
请求的数据:
{"phone":"xxx","code":"123456","messageType":3,"key":"a2088d42-2eb0-4194-aada-e3a0019ed5f1","registration_type":1,"channel":"zhulogic","unionid":""}
请求的头部
Content-Type:application/json;charset=UTF-8
5、内置脚本说明
1. 清除一个全局变量Clear a global variable对应脚本:postman.clearGlobalVariable("variable_key");参数:需要清除的变量的key2.清除一个环境变量Clear an environment variable对应脚本:postman.clearEnvironmentVariable("variable_key");参数:需要清除的环境变量的key3.response包含内容Response div:Contains string对应脚本:tests["Body matches string"] =responseBody.has("string_you_want_to_search");参数:预期内容4.将xml格式的response转换成son格式Response div:Convert XML div to a JSON Object对应脚本:var jsonObject = xml2Json(responseBody);参数:(默认不需要设置参数,为接口的response)需要转换的xml5.response等于预期内容Response div:Is equal to a string对应脚本:tests["Body is correct"] = responseBody === "response_div_string";参数:预期response6.json解析key的值进行校验Response div:JSON value check对应脚本:tests["Args key contains argument passed as url parameter"] = 'test' in responseJSON.args参数:test替换被测的值,args替换被测的key7.检查response的header信息是否有被测字段Response headers:Content-Type header check对应脚本:tests["Content-Type is present"] = postman.getResponseHeader("Content-Type");参数:预期header8.响应时间判断Response time is less than 200ms对应脚本:tests["Response time is less than 200ms"] = responseTime < 200;参数:响应时间9.设置全局变量Set an global variable对应脚本:postman.setGlobalVariable("variable_key", "variable_value");参数:全局变量的键值10.设置环境变量Set an environment variable对应脚本:postman.setEnvironmentVariable("variable_key", "variable_value");参数:环境变量的键值11.判断状态码Status code:Code is 200对应脚本:tests["Status code is 200"] = responseCode.code != 400;参数:状态码12.检查code name 是否包含内容Status code:Code name has string对应脚本:tests["Status code name has string"] = responseCode.name.has("Created");参数:预期code name包含字符串13.成功的post请求Status code:Successful POST request对应脚本:tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;14.微小验证器Use Tiny Validator for JSON data 对应脚本: var schema = {"items": {"type": "boolean"}};var data1 = [true, false];var data2 = [true, 123];console.log(tv4.error);tests["Valid Data1"] = tv4.validate(data1, schema);tests["Valid Data2"] = tv4.validate(data2, schema);参数:可以修改items里面的键值对来对应验证json的参数折叠
相关文章:
科普文:一文搞懂Postman
1. 概叙 1.1 Postman简介 Postman是一款强大的接口测试工具,主要用于测试HTTP请求,支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等,并且提供了丰富的功能来模拟和测试各种网络请求。 Postman官网上这样介…...
LearnOpenGL学习(模型加载 -- Assimp,网格,模型)
完整代码见:zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时,会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息(颜色、贴图等) Assi…...
基于Pyhton的人脸识别(Python 3.12+face_recognition库)
使用Python进行人脸编码和比较 简介 在这个教程中,我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码,并比较两个人脸是否相似。face_recognition库是一个强大的工具,它基于dlib的深度学习模型,可以轻松实…...
Scala的模式匹配(2)
package hfdobject Test34_2 {//match case匹配元组//能根据元组元素的个数来匹配,不是一一精确的匹配值def main(args: Array[String]): Unit {val d1(1,2,3) // val d1(1,2,3,4) // val d1(1,2,3,4,5)val d:Anyd1 //d的类型是Anyd match {case (x,y,z)>…...
Java 初学者的第一个 SpringBoot 系统
Java 初学者的第一个 SpringBoot 系统 对编程初学者而言,都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”,他们即使再努力也没有办法了解完整的系统,即使他们把教科书里的所有程序都跑通了。但是,面对…...
java IO面试题
目录 Java IO设计上使用了什么设计模式? 你怎么理解同步IO和异步IO? 字节流和字符流的区别? Java 流量有多少种类型? 如何将一个 java 将对象序列化到文件中? 如何实现 java 序列化? Filter流是什么? Filter流有哪些可用? 如何实现对象克隆? BIO、…...
Chocolatey软件包管理工具处理MSI升级的原理与实践
Chocolatey软件包管理工具处理MSI升级的原理与实践 在Windows环境下,Chocolatey作为一款强大的包管理工具,其处理MSI(Microsoft Installer)格式软件包升级的机制值得深入探讨。本文将详细介绍Chocolatey如何处理MSI升级ÿ…...
Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)
Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录,找到安装程序,安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接,提示连接成功。 Spr…...
【Git】
博文将不断学习补充 Git下载 将下载链接复制到迅雷中,快速下载 Git安装 保持默认,傻瓜安装即可。 注册Gitee码云,设置公钥 在Git Bash中输入 ssh-keygen -t ed25519 -C "Gitee SSH Key" 找到对应的公钥文件 复制公钥,添…...
HttpServletRequest
HttpServletRequest 类确实是一个封装了完整 HTTP 请求信息的对象,而 Spring MVC 提供了更简化的方式来自动映射请求路径、请求参数等信息到控制器方法中。你不必直接使用 HttpServletRequest 来处理大部分常见的请求内容,因为 Spring MVC 会为你自动处理…...
Apache HttpClient 4和5访问没有有效证书的HTTPS
本文将展示如何配置Apache HttpClient 4和5以支持“接受所有”SSL。 目标很简单——访问没有有效证书的HTTPS URL。 SSLPeerUnverifiedException 在未配置SSL的情况下,尝试消费一个HTTPS URL时会遇到以下测试失败: Test void whenHttpsUrlIsConsumed…...
做异端中的异端 -- Emacs裸奔之路7: 怀念Vim的好
组合键的瑕疵 从Vim切换成Emacs之后,有一明显的不适就是感受Emacs的按键很硬, Vim移动是使用一个按完成的,而Emacs是组合键。 如果向前移动一个字,Vim只要在ESC模式下按w,而Emacs是Alt-f. 特别是当你对键盘改键之后不…...
asp.net core过滤器应用
筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器,用于系统授权。一般不会编写自定义的授权过滤器,而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…...
VideoBooth: Diffusion-based Video Generation with Image Prompts
VideoBooth: Diffusion-based Video Generation with Image Prompts 概括 文章提出了一个视频生成模型VideoBooth,输入一张图片和一个文本提示词,即可输出保持图片中物体且符合文本提示词要求的视频。 方法 粗-细两阶段设计:1)…...
面阵相机的使用和注意事项
引言 面阵相机(Area Scan Camera)是一种广泛应用于工业视觉、医学成像、安防监控以及科研领域的图像采集设备。与线扫相机不同,面阵相机的传感器包含多行像素(例如1280x1024、1920x1080等),能够在一个曝光…...
人工智能与机器学习在智能扭矩系统中的应用
【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。】 在当今科技飞速发展的时代,智能扭矩系统正经历着一场深刻的变革,而人工智能(AI)和机器学习算法的应用成为了推动这一变革的关键力量。 传统的扭矩…...
【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo
项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo,完全适配HarmonyOS NEXT系统,实现了发送消息,添加好友等基础功能。代码开源,功能简洁,如果您有类似开发需求可以参考。 源码地址:https://github.c…...
【 AI技术赋能有限元分析与材料科学应用实践】Neo-Hookean 材料与深度学习结合的有限元分析
Neo-Hookean 材料模型是用于描述非线性弹性材料(如软组织和橡胶等)的经典模型,特别适用于大变形问题。其基本思想是通过应变能密度函数来描述材料的弹性行为。在该模型中,材料的应力-应变关系不仅依赖于应变能,还通过变…...
Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二
1.先导入数据到origin 2.导入文件的时候注意:名字短的这个是,或者你打开后看哪个里面有800,因为我的激光重频是1.25Hz(应该是,不太确定单位是KHz还是MHz),所以对应的时间是800s。 3.选中两列直接…...
LeetCode Hot100 51~60
图论51. 岛屿问题52. 腐烂的橘子53. 课程表54. 前缀树55. 全排列56. 子集57. 电话号码58. 组合总和59. 括号生成60. 单词搜索 图论 51. 岛屿问题 经典洪水问题算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int nr grid.size…...
第一节:ORIN NX介绍与基于sdkmanager的镜像烧录(包含ubuntu文件系统/CUDA/OpenCV/cudnn/TensorRT)
ORIN NX技术参数 Orin NX版本对比 如上图所示,ORIN NX官方发布的版本有两个版本一个版本是70TOPS算力,DDR为8GB的版本低配版本,一个是100TOPS算法,DDR为16GB的高配版本。 Orin NX的外设框图 两个版本除了GPU和DDR的差距外,外设基本上没有区别,丰富的外设接口,后续开发…...
使用Pygame创建一个简单的消消乐游戏
消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前,请确保已安装Pygame库。可以通过以下命…...
node.js基础学习-JWT登录鉴权(十四)
一、前言 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它本质上是一个字符串,由三部分组成:头部(Header)、载荷(Payload&am…...
AbutionGraph-时序向量图谱数据库-快速安装部署
运行环境 1)操作系统 最好是使用CentOS7或者Ubuntu18以上系统,不满足的话请升级系统内核gcc版本至8以上版本。 支持所有国产主流操作系统银河麒麟、统信OS、深度等等,均做过兼容性测试; 2)CPU 为确保数据库每个进…...
翻译质量差对电子课程用户体验的影响
电子学习改变了教育交付方式,使全球不同受众更容易获得课程。然而,随着这种学习模式的发展,对周到地本地化和翻译的需求也在增长。如果做得好,翻译可以弥合文化和语言分歧,创造无缝和包容的学习体验。然而,…...
PS的功能学习(修复、画笔)
混合器画笔工具 就像,电子毛笔 关键功能有两个,自带一个混合器色板 清理画笔是全清,换一支新的毛笔,执行完之后在判断是否载入画笔 载入画笔就是把前景色上的颜色进行叠加处理,重新混入当前的混合色 (…...
Android 使用 Canvas 和 Paint 实现圆形图片
学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …...
vxe-table 键盘操作,设置按键编辑方式,支持覆盖方式与追加方式
vxe-table 全键盘操作,按键编辑方式设置,覆盖方式与追加方式; 通过 keyboard-config.editMode 设置按键编辑方式;支持覆盖方式编辑和追加方式编辑 安装 npm install vxe-pc-ui4.3.15 vxe-table4.9.15// ... import VxeUI from v…...
BUUCTF Pwn [HarekazeCTF2019]baby_rop 题解
下载 checksec 64位 用IDA64打开 定位main函数 栈溢出漏洞 SHIFTF12的字符串看到了binsh 以及函数窗口有system 因为是64位 找到rdi传参和ret栈平衡 构造exp: from pwn import *#p process(./babyrop) p remote("node5.buuoj.cn", 27869)addr_prr 0…...
什么是封装性?C++ 中如何实现封装?封装性的好处是什么?
一、引言 在面向对象编程中,封装性是一个重要的概念。封装可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和安全性。本文将详细介绍什么是封装性,C 中如何实现封装以及封装性的好处。 二、什么是封装性? 封装…...
【MySQL】[42000][1071] Specified key was too long; max key length is 3072 bytes
问题描述 创建表时发生错误。 create table if not exists tbl_user(id int unsigned auto_increment comment 用户IDprimary key,username varchar(1023) not null comment 用户名,password varchar(1023) default 123456 …...
人工智能驱动的骗局会模仿熟悉的声音
由于人工智能技术的进步,各种现代骗局变得越来越复杂。 这些骗局现在包括人工智能驱动的网络钓鱼技术,即使用人工智能模仿家人或朋友的声音和视频。 诈骗者使用来自社交媒体的内容来制作深度伪造内容,要求提供金钱或个人信息。个人应该通过…...
实数与复数频谱掩蔽在音频分离中的应用
使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中,通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型:实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…...
C++算法练习-day62——491.非递减子序列
题目来源:. - 力扣(LeetCode) 题目思路分析 这个问题要求找出数组 nums 中的所有非严格递增子序列,其中每个子序列至少包含两个元素。非严格递增子序列意味着子序列中的元素可以相等,但不允许递减。 为了解决这个问…...
golang实现单例日志对象
原文地址:golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包,通过设置和修改都能实现日志轮转和自定义日志格式。例如:log、zap、golog、slog、log4go 等等。 …...
Redis——个人笔记留存
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是…...
c# Grpc取消
net6.0 通过CancellationTokenSource 客户端取消Grpc,服务端判断 IsCancellationRequested 是否取消。 proto: syntax "proto3";// 引用可空类型 import "google/protobuf/wrappers.proto";option csharp_namespace "Grpc.Common"…...
Flask 是什么?
近期开发chatbot 程序,过程中要使用Flask,所以收集资料记录这个套件的信息: Flask 是什么? Flask 是一个轻量级、模块化的 Python Web 框架,用于构建 Web 应用程序和 API。它被设计为简单、灵活且可扩展,…...
智能合约
06-智能合约 0 啥是智能合约? 定义 智能合约,又称加密合约,在一定条件下可直接控制数字货币或资产在各方之间转移的一种计算机程序。 角色 区块链网络可视为一个分布式存储服务,因为它存储了所有交易和智能合约的状态 智能合约还…...
【机器学习】分类器
在机器学习(Machine Learning,ML)中,分类器泛指算法或模型,用于将输入数据分为不同的类别或标签。分类器是监督学习的一部分,它依据已知的数据集中的特征和标签进行训练,并根据这些学习到的知识对新的未标记数据进行分…...
ASP 快速参考
ASP 快速参考 概述 ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于动态生成交互性网页。它允许开发者结合HTML、VBScript或JScript脚本语言来创建和运行动态网页或Web应用程序。本快速参考将提供ASP的基础知识、常用内置…...
支持向量机算法:原理、实现与应用
摘要: 本文深入探讨支持向量机(Support Vector Machine,SVM)算法,详细阐述其原理、数学模型、核函数机制以及在分类和回归问题中的应用方式。通过以 Python 和 C# 为例,展示 SVM 算法在不同编程环境下的具体…...
蓝桥杯分治
P1226 【模板】快速幂 题目描述 给你三个整数 𝑎,𝑏,𝑝a,b,p,求 𝑎𝑏 mod 𝑝abmodp。 输入格式 输入只有一行三个整数,分别代表 𝑎,𝑏,𝑝a,b,p。…...
群控系统服务端开发模式-应用开发-邮件工厂结构封装
首先在系统根目录下extend文件夹下创建邮件工厂文件夹并更名叫Mail。 一、邮件发送父类 在Mail目录下创建邮件发送父类并更名为MailSenderInterface.php,代码如下 <?php /*** 邮件发送父类* User: 龙哥三年风水* Date: 2024/12/5* Time: 14:22*/ namespace Ma…...
COCO数据集理解
COCO(Common Objects in Context)数据集是一个用于计算机视觉研究的广泛使用的数据集,特别是在物体检测、分割和图像标注等任务中。COCO数据集由微软研究院开发,其主要特点包括: 丰富的标签:COCO数据集包含…...
数据结构与算法学习笔记----堆
数据结构与算法学习笔记----堆 author: 明月清了个风 first publish time: 2024.12.2 revised: 2024.12.3 - 例题标题错误,已修改。 ps⛹从这里开始调整了文章结构,先讲解算法和数据结构基本原理,再给出例题,针对例题中的应用再…...
在玩“吃鸡”的时候游戏崩溃要如何解决?游戏运行时崩溃是什么原因?
“吃鸡”游戏崩溃问题深度解析与解决方案:原因、修复与预防 在紧张刺激的“吃鸡”(即《绝地求生》)游戏中,突然遭遇游戏崩溃无疑会让玩家倍感沮丧。作为一名经验丰富的软件开发从业者,我深知游戏崩溃可能由多种因素引…...
AndroidAutoSize实战教程:今日头条屏幕适配方案详解
如何在项目中结合 AndroidAutoSize 来进行今日头条屏幕适配,我会具体讲解如何用 AndroidAutoSize 实现屏幕适配,并结合 Kotlin 代码举例分析。 通过 AndroidAutoSize 库来实现屏幕适配,确保在不同的屏幕尺寸、分辨率、密度下,应用…...
学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 贴图 二、…...
图生3d 图生全景 学习笔记
目录 Aluciddreamer ZoeDepth 会自动下载模型: 图生全景图SD-T2I-360PanoImage: Aluciddreamer GitHub - luciddreamer-cvlab/LucidDreamer: Official code for the paper "LucidDreamer: Domain-free Generation of 3D Gaussian Splatting Sce…...