本文介绍了如何使用 Node.js 的常用库发送 RESTful 的 API 调用。用 CNode 社区的 API 举例说明如何发送 get 和 post 请求。
我们知道,浏览器访问的 URL 通过 HTTP 访问网站,HTTP 的方法可以是 get 或 post, 比如我们在使用搜索引擎搜索网络内容时,以 bing 搜索为例,当在搜索框中输入一个关键字如 CukeTest 进行搜索时,会发送如下的 get 请求:https://cn.bing.com/search?q=CukeTest&qs=n&form=QBLH&sp=-1&pq=cuketest&sc=0-8&sk=&cvid=15A4BA327CB143A38EFA87594735E7F0
这个 URL 中前面https://cn.bing.com/search 为请求路径。其余部分为请求参数。简单总结下,在完整的 URL 中,以 ? 为分隔,? 之前的部分为请求路径,后面部分为请求参数。多个请求参数以 & 符号连接,参数名与参数的值以 = 连接。
RESTful api 也是发送 HTTP 请求,它的 get 请求通常用来检索信息。以 Node.js 著名的社区 CNode 社区为例,它提供 API 直接访问 CNode 社区的数据。地址为https://cnodejs.org/apiCNode 社区的源码(https://github.com/cnodejs/nodeclub/)部署在自己的测试环境。在 CNode 的 api 说明中,可以看到第一个为 get 请求:,或者可以将
get /topics 主题首页
接收 get 参数
page Number 页数
tab String 主题分类。目前有 ask share job good
limit Number 每一页的主题数量
mdrender String 当为 false 时,不渲染。默认为 true,渲染出现的所有 markdown 格式文本。
查询主题首页的数据,根据这个 api 说明文档,我们可以直接在浏览器中访问 https://cnodejs.org/api/v1/topics ,它返回首页主题的数据。如果要一些限定条件,比如限制每一页的主题数量为 1,则可以加上 limit 参数,请求路径为 https://cnodejs.org/api/v1/topics?limit=1 再添加参数的话,后面使用 & 连接起来,如果再限定下页数为 1,请求路径即为https://cnodejs.org/api/v1/topics?limit=1&page=1,浏览器中直接访问此链接即可。
post 请求是向指定的资源提交要被处理的数据。post 请求与 get 请求不同的是,post 请求的参数是在 body 中存放。比如,常用的登录操作就是用 post 方法向服务器传送数据。
"got"是一个流行且语法好用的模拟发送 http 请求的 npm 库。安装方式简单,安装完 Node.js 之后,在项目目录下直接执行 npm install got --save ,即可完成安装。
上面我们介绍了 api 测试中常见的 get 请求,可以直接在浏览器中进行对 get 请求的验证。下面演示下在如何使用 got 库进行 get 请求。
我们参考了 cnodejs.org 社区的 API 来进行说明 https://cnodejs.org/api。
以首页主题为例,代码如下:
let got = require('got');
async function sendGet() {
// got 默认调用get请求方法
let res= await got('https://cnodejs.org/api/v1/topics?limit=1');
console.log(res.body);
}
sendGet();
使用 got 库可以很方便发送 get 请求,但是在自动化测试中,我们还需要针对服务器相应的数据进行判断,如上面的请求中,验证的数据如下表:
状态码 :200
返回结果数据长度 :1
同时可以使用 node.js 自带的 assert 库来进行判断:
let got = require('got');
let assert = require('assert');
async function sendGet() {
let res= await got('https://cnodejs.org/api/v1/topics?limit=1');
// console.log(res.body)
// 将返回结果解析为JSON对象
let result = JSON.parse(res.body);
// 判断状态码
assert.equal(200,res.statusCode);
// 判断返回的帖子长度是否为1
assert.equal(1,result['data'].length);
}
sendGet();
以 CNode 社区的 "创建主题 " api 为例:
根据 api 文档,我们知道返回数据 success 字段为 true,可以添加验证,代码如下:
let got = require('got');
let assert = require('assert');
async function sendPost () {
// 请求方法体
let bodydata = {
accesstoken:"xxx自己注册账号的tokenxxx",
tab:'dev',
title:'hello,world!',
content:'this is a test topic'
}
let result = await got.post('https://cnodejs.org/api/v1/topics',{
// 设置数据类型为JSON 数据类型
json:true,
body:bodydata })
console.log(result.body)
let result_data = result.body;
assert.equal(true,result_data['success']);
}
sendPost();
为方便 node.js 开发,可以使用易用性较高的 vscode 或 CukeTest(http://cuketest.com)。
使用 got 库很方便的模拟 http 的请求,通过 nodejs 自带的断言,可以对数据结果进行判断,下一步只需要把这些操作库集成到框架中,就能快速完成 api 的自动化测试。
更多关于 got 库的使用可以参考 got 文档:https://www.npmjs.com/package/gotgot 库来模拟 http 请求,也可以使用 nodejs 其它库,比如:axios,request 等其它库。。另外除了可以使用