Featured image of post 第四章 接口测试

第四章 接口测试

接口测试技术

接口测试概念

接口一般又称为 API ,全称为 Application Programming Interface,人们无时不刻不在使用 Interfaces,例如乘坐电梯里面的按钮是一个 Interface,开车的油门也是 Interface,计算机操作系统也有很多的接口。

接口测试是指 系统或组件之间进行信息交互的通道 。在软件开发的过程中,随着项目需求越来越多,软件的功能会越来越复杂,接口也会不断增多,为了确保软件系统中的接口能够正常进行 信息交互和传输数据 ,就需要开展接口测试。

接口测试是对系统组件间接口进行的测试,其原理是模拟客户端向服务端发送请求,服务器接收到请求后进行相应的业务处理,并向客户端返回响应数据。

测试人员在进行接口测试时,需要关注软件系统中被测接口之间数据的传递、交换和控制管理过程,以及接口与接口之间是否存在逻辑依赖关系,并检测服务器向客户端返回的相应数据是否符合预期结果。

通过工具实现接口测试

常用的接口测试工具有 Postman、JMeter 等。

JMeter 是 Apache 基于 Java 开发的一款免费开源工具,它支持多个协议,具有丰富的第三方插件,不仅可以进行性能测试,而且可以进行接口测试。

Postman 是一款简单易操作的接口测试工具,支持批量运行、保存历史记录,容易学习。

通过代码实现接口测试

测试人员使用 Java、Python 等语言编写代码也可以实现接口测试,在使用 Java 语言编写接口测试的代码时,通常需要结合 HttpClient 技术;在使用 Python 语言编写接口测试的代码时,通常需要结合 Request 框架。

虽然通过代码实现接口测试能够让测试人员与开发人员使用相同的技术栈,更好地对接测试流程,但是这种方式要求测试人员具备一定的编程能力,难度较大。

接口类型

HTTP 接口

HTTP 协议是建立在 TCP 协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次 HTTP 请求。HTTP 会通过 TCP 建立起一个到服务器的连接通道,当获取本次请求需要的数据后,HTTP 会立即将 TCP 连接断开,这个过程是很短的。所以 HTTP 连接是一种短连接,是一种无状态的连接。

Web Service 接口

Web Service 是一种跨编程语言和跨操作系统平台的远程调用技术。Web Service 使用了最初设计用于人机交流的基于 HTTP 的 Web 技术,用于系统间以 XML 进行通讯。

Web Service 有以下特征:

可以用于互联网或局域网、使用标准 XML 消息系统、跨编程语言跨操作系统、通过 XML 语法自描述、可以通过简单的查找机制发现。

RPC 接口

RPC(Remote Procedure Calls,远程过程调用)是一种协议,程序可以使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。

在 RPC 中,发出请求的程序是客户程序,提供服务的程序是服务器。RPC 是一项广泛用于支持分布式应用程序的技术,主要目的是为组件提供一种相互通信的方式,是这些组件之间能够相互发出请求并传递这些请求的结果。

RMI 接口

RESTful 接口

网络基础 TCP/IP

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信、不同的硬件与操作系统之间怎么通信等,所有的这一切都需要一种规则,这种规则被称为 协议 (protocol)。

像这样把与互联网相关联的协议集合起来总称 TCP/IP 协议族,其最重要的一点是分层。TCP/IP 协议族按层次分为 应用层、传输层、网络层、数据链路层

  1. 应用层

    应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务,比如FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)、HTTP 协议。

  2. 传输层

    传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。

  3. 网络层

    网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

  4. 数据链路层

    用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡)、光纤等物理可见部分(还包括连接器等一切传输媒介),硬件上的范畴均在链路层的作用范围之内。

TCP 三次握手

为了准确无误地将数据送达目标处,TCP 协议采用了 三次握手 策略。用 TCP 协议把数据包送出去后,TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志 —— SYN(synchronize) 和 ACK(acknowledgement)。

  1. 发送端首先发送一个带 SYN 标志的数据包给对方

  2. 接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息

  3. 发送端再回传一个带 ACK 标志的数据包,代表“握手”结束

若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。

TCP 四次挥手

确保当前数据完全被接收后再关闭连接,TCP协议采用 四次挥手 策略。

  1. 客户端向服务器发送一个数据包,主动断开连接(序列号 X),客户端仍可接收数据。

  2. 服务器向客户端发送确认包,表明服务器已经收到客户端的报文(序列号X + 1)。服务器告知客户端数据没有发送完毕,暂时不能进行第三次挥手。

  3. 服务器向客户端发送数据包和确认包,用来停止向客户端发送数据(序列号Y)。服务器告知客户端数据已发送完毕,可以断开链接。

  4. 客户端向服务器发送一个响应数据包(序列号Y + 1 ),规定时间后发送确认包并进入关闭状态。

负责域名解析的 DNS 服务

DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务,如通过域名查找 IP 地址,或逆向从 IP 地址反查域名。

计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名,DNS 服务就是为了解决计算机对域名的理解。

HTTP 协议

统一资源定位符

URI (统一资源标识符)是 Uniform Resource Identifier 的缩写。

  • Uniform:规定统一的格式处理多种不同类型的资源,不用根据上下文环境来识别资源指定的访问方式。
  • Resource:资源的定义是“可标识的任何东西”,不仅是文档文件、图像或服务等。
  • Identifier:可标识的对象,也称为标识符。

URI 就是由某个协议方案表示的资源的定位标识符 ,协议方案是指访问资源所使用的协议类型名称,如采用 HTTP 协议时,协议方案就是 http,除此之外,还有 ftp、mailto、file、telnet 等。

URI 用字符串标识某一互联网资源,而 URL 表示资源的地点 (互联网上所处的位置),所以 URL 是 URI 的子集。

1
2
3
4
5
6
7
协议://hostname[:port]/path[?查询参数1&查询参数2]

协议://域名+端口号/资源路径+参数

https://www.bilibili.com/movie/?spm_id_from=333.1007.0.0

http://127.0.0.1:5500/test.html

协议: 数据传输的格式,如 http、https 等。

服务器地址: 域名或 IP,.com域名是使用最早也最广泛的域名,还有例如表示工商企业的 .top,表示网络提供商的 .net,表示非盈利组织的 .org 等。

端口: 应用程序对外访问的唯一标识,常用端口号有 80(http)、443(https),协议默认的端口号可以省略,如 https://www.baidu.com/:443

资源路径: 主机资源的具体地址,包括目录和文件名等,用 “/” 隔开,如 /movie。

参数: 客户端向服务器传递的数据,参数与路径之间用 “?” 符号隔开,多个参数之间用 “&” 符号隔开。

HTTP 请求

HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。

HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的, 服务器端在没有接收到请求之前不会发送响应

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。

请求行: 位于请求数据的第一行,作用是说明请求方法、访问的资源、协议版本,常用的请求方法如下:

请求方法 说明
GET 用于请求服务器获取指定的资源
POST 用于请求服务器提交指定的资源
PUT 用于请求服务器更新指定的资源
DELETE 用于请求服务器删除指定的资源

请求头: 位于第二行到空白行之间,作用是通知服务器客户端的请求信息,请求头部由键值对组成,每行一对,常见的请求头字段如下:

请求头字段 说明
Host 表示接收请求的服务器地址
User-Agent 表示产生请求的浏览器地址
Accept 表示客户端可以识别的内容类型列表
Content-Type 表示请求体数据的类型
Accept-Encoding 表示服务器可以发送的数据压缩格式
Accept-Language 表示服务器可以发送的语言
Connection 指定与连接相关的属性

请求体: 位于空白行之后,是传输给服务器数据的实体,常在 POST、PUT 方法中使用,常配合的请求头有 content-type 和 content-length,,参数 content-type 用于规定请求体数据类型,取值类型有 text/html、image/jpeg、application/jsonapplication/x-www-form-urlencoded、multipart/form-data 等,请求报文中可以没有请求体。

HTTP 响应

响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

状态行: 位于响应数据的第一行,用来描述服务器的处理结果,由协议版本号、状态码、状态消息组成,其中状态码由三位数字组成,第一个数字定义响应类别。

响应类型 含义
1xx 表示指示信息
2xx 表示请求成功
3xx 表示请求重定向
4xx 表示客户端错误
5xx 表示服务器错误

在接口测试中,常见的状态码和描述如下:

状态码 描述
200 OK,客户端请求成功
400 Bad Request,客户端请求有语法错误
401 Unauthorized,客户端请求未经授权
403 Forbidden,服务器收到请求,但是拒绝提供服务
404 Not Found,客户端请求的资源不存在
500 Internal Server Error,服务器发生错误
503 Server Unavailable,服务器当前不能处理客户端的请求

响应头: 响应头是指服务器对客户端请求的应答信息,它位于状态行的下方,主要由键值对组成,与 HTTP 协议中的请求头类似,常见的响应头字段如下:

请求头字段 说明
Server 表示服务器用到的软件信息
Content-Type 表示服务器实际返回给客户端的内容类型
Connection 表示服务器与客户端的连接类型
Connection-Length 表示服务器告知浏览器需要接收的数据长度
Connection-Language 表示服务器可以识别的内容语言列表
Accept-Encoding 表示服务器可以发送的数据压缩格式

响应体: 响应体是服务器发送到客户端的实际内容,它位于响应头的下方,响应体的内容类型由响应头中的 Content-Type 指定。

使用开发者工具进行抓包

打开浏览器访问指定网页,按键盘上的 F12 键,或者邮件空白处选择打开开发者工具,单击 “Network” 可以查看抓取的相关数据信息。

其中,“ALL” 或者 “全部” 是默认被选中的,由于先访问网页再打开开发者工具,所以没有显示抓取的请求资源信息,此时需要刷新浏览器,重新抓取请求资源信息。

Postman 入门

Postman 是谷歌开发的一款用于网页调试和接口测试的工具,Postman 能够模拟客户端发送 HTTP 请求至服务器,同时能够接收服务器返回的 HTTP 响应。测试人员通过验证接收到的响应数据是否与预期数据一致,从而判定接口数据是否存在缺陷。

安装 Postman

进入 Postman 官网 Postman API Platform | Sign Up for Free,选择 windows 版本,单击 Windows 64-bit 按钮后即可下载 Postman 安装包。

运行程序,如果没有账号可以点击 Create Free Account 注册账号,完成后进入主页面。

点击左侧栏的扩展符号可以管理选项:

  • Collections:表示集合,可以对项目模块中的接口进行分类和管理。

  • APIs:表示应用程序接口,用于定义集合和环境。

  • Environments:表示环境,可以定义全局变量和环境变量。

  • Mock Servers:表示模拟服务器。

  • Monitors:表示监听器,能够定期运行集合中的请求。

  • Flows:表示流程,能够通过逻辑连接请求模拟实际项目中的流程。

  • History:表示历史记录。

发送第一个 HTTP 请求

  1. 创建集合

在 Postman 的主窗口中,首先单击左侧的 Collection 选项,然后单击 Collection 选项右侧的加号图标即可创建集合 New Collection。

  1. 添加 HTTP 请求

点击 New Collection 条目右侧的省略号,在下拉表中选择 Add request 选项即可添加一个 HTTP 请求。

添加的 HTTP 请求默认名称为 New Request,默认的请求方法为 GET,在 New Request 下方可以根据实际测试需求设置请求方法和请求地址。

请求方法和请求地址下方的标签的具体介绍如下:

  • Params:表示参数,单击该标签可以在下方设置请求地址参数。

  • Authorization:表示授权,单击该标签可以了解授权信息,通常在发送请求时,在其下方会自动生成授权的请求头。

  • Headers:表示请求头,单击该标签可以在下方设置请求头。

  • Body:表示请求体,单击该标签可以在下方设置请求体参数。

  • Pre-request Script:表示预请求脚本,单击该标签可以在下方编写预请求脚本代码。

  • Tests:表示测试,单击该标签可以在下方编写测试脚本代码,例如断言代码、关联代码等。

  • Settings:表示设置,单击该标签可以在下方进行相关的设置操作,例如启用 SSL 证书验证、自动跟随重定向等。

在创建 HTTP 请求时,默认选中的标签为 “Params”,接口测试的过程中,常用的标签分别是 “Params”、“Headers”、“Body”、“Tests”。

  1. 填写百度网站的请求信息并发送请求。

在上述步骤后,设置请求方法为 “GET”,将请求地址设置为 www.baidu.com,点击 “Save” 按钮或者通过 “Ctrl + S” 保存,最后单击 “Send” 按钮发送请求。

可以看到在响应结果区域的右上角显示了 “200 OK”,说明请求发送成功,在 “Body” 下方展示了具体的响应结果,说明服务器已经接收到客户端的请求信息,并成功将响应结果返回给客户端。

Postman 的基本使用

Postman 断言

断言是程序中的一种逻辑判断式,目的是验证软件开发的预期结果与实际结果是否一致。

常用的断言有 响应状态码断言、包含指定字符串断言、JSON 数据断言 等。

响应状态码断言

响应状态码断言是对 HTTP 响应的状态码进行断言。在 Postman 中,有 2 种方式实现响应状态码断言。

第一种方式是在 HTTP 请求中单击 “Test” 标签,在其下方空白区域手动编写响应状态码断言的代码;

第二种是首先在 HTTP 请求中单击 “Test” 标签,然后单机 Postman 主窗口右侧的 “Staus code:Code is 200”,自动生成响应状态码断言的代码模板。

1
2
3
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

代码中,pm 是一个实例,表示 Postman,test() 是 pm 实例中的一个测试方法,该方法有 2 个参数,分别是 “function () {pm.response.to.have.status(200);}” 和 “Status code is 200” ,具体说明如下:

  • “Status code is 200”:该参数的作用是显示断言结果的文字,可以根据实际测试需求自定义,不会影响断言结果。
  • “function () {pm.response.to.have.status(200);}":该参数是一个匿名函数,作用是判断响应结果中的状态码是否是 200。

包含指定字符串断言

包含指定字符串断言是指对 HTTP 响应中的某个字符串进行断言,可以手动编写,也可以选择主窗口右侧的 “Response body:Contains string” 自动生成模板。

1
2
3
pm.test("Body matches string", function () {
  pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
  • “function(){pm.expect(pm.response.text()).to.include(”…”);})":该参数用于断言响应文本中是否包含想要搜索的字符串,其中 “string_you_want_to_search” 需要根据接口文档的描述修改为预期结果。
  • “Body matches string”:该参数用于显示断言结果的提示文字,可以根据实际测试需求自定义,不会影响断言结果。

JSON 数据断言

JSON 数据断言是对 HTTP 响应中的 JSON 数据进行断言,可以手动编写,也可以选择主窗口右侧的 “Response body:JSON value check” 自动生成模板。

1
2
3
4
pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});
  • “function () {var jsonData = pm.response.json();pm.expect(…).to.eql(100);})":该参数用于将响应结果中的 JSON 数据全部赋值给变量 jsonData, 其中 “pm.expect(jsonData. value).to.eql(100)” 用于断言响应结果中 JSON 数据的值 value 是否等于 100。在实际接口测试中需要根据接口文档的描述填写 value 及对应的值。
  • “Your test name”:该参数用于像是断言结果的提示文字,可以根据实际测试需求自定义,不会影响断言结果。

Postman 关联

在接口测试中,关联是指两个或两个以上的接口相互依赖关系,例如,某个接口请求地址中的参数是另一个接口的影响结果中的数据,则说明这两个接口之间存在关联关系。

在使用 Postman 做接口测试时,实现接口关联的方式是在 Postman 中设置环境变量或全局变量,具体实现步骤如下:

(1)获取第 1 个接口请求的响应结果。

(2)提取响应结果中的某个字段,将其保存到 Postman 环境变量或全局变量中。

(3)在第 2 个接口的请求地址中引用环境变量或全局变量,引用方式为 “{{环境变量或全局变量}}"。

Postman 参数化

Postman 生成测试报告

API 接口服务系统

启动系统

本节内容参考 白月黑羽 教程,地址:https://www.byhy.net/

白月黑羽 B 站地址:https://space.bilibili.com/401981380

下载压缩包 bysms.zip,解压bysms.zip后,进入bysms目录,双击运行 runserver.bat 即可启动系统。

启动系统后会弹出一个窗口,不要关闭,否则 web 系统会停止。

如果启动运行 出现闪退或者如下错误提示,很可能 是因为web服务的80端口已经被使用了。

1
2
3
**!!! runtime error: invalid memory address or nil pointer dereference
Serve HTTP on 0.0.0.0:80
listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions

两种解决方法:

  1. 请检查关闭占用 80 端口的程序,可能是 Apache、IIS 等 web 服务。
  2. 修改 bysms 使用的 web 服务端口,可以用 文本编辑器编辑 runserver.bat,如果你是 Mac 电脑,修改 runserver.sh。
1
2
3
解决方法:将端口号 80 修改成其他端口

bysms.exe 0.0.0.0:80	→	bysms.exe 0.0.0.0:8047

保存后,重新运行即可,注意,修改后访问网址要加上端口号,http://127.0.0.1:8047

构建 HTTP 请求

根据协议规范, HTTP头里面的 Content-Type 字段指明消息体格式,比如 urlencodedapplication/x-www-form-urlencodedjsonapplication/json,当请求被发送的时候,Postman会根据你设定的消息体格式,自动加上对应的 Content-Type 消息头。

以 bysms 系统为例, 登录接口消息体的格式是 urlencoded, 所以,Postman中应该这样设置。

而添加客户接口消息体的格式是 json, 所以,Postman中应该这样设置。

系统接口文档

本接口中,所有请求 ( 除了登录请求之外 ),必须在 cookie 中携带有登录的成功后,服务端返回的 sessionid。

登录系统

请求消息

1
2
POST  /api/mgr/signin  HTTP/1.1
Content-Type:   application/x-www-form-urlencoded

请求参数

http 请求消息 body 中 参数以 格式 x-www-form-urlencoded 存储,需要携带如下参数:

  • username 用户名。

  • password 密码。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果登录成功,返回如下:

1
2
3
{
    "ret": 0
}

ret 为 0 表示登录成功,如果登录失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg":  "用户名或者密码错误"
}

ret 不为 0 表示登录失败, msg 字段描述登录失败的原因。

列出客户

请求消息

1
GET  /api/mgr/customers  HTTP/1.1

请求参数

http 请求消息 url 中需要携带如下参数:

  • action

    必填项,填写值为 list_customer。

  • pagesize

    必填项,分页的每页获取多少条记录。

  • pagenum

    必填项,获取第几页的信息。

  • keywords

    可选项, 里面包含的多个过滤关键字,关键字之间用空格分开。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果获取信息成功,返回如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "ret": 0,
    "retlist": [
        {
            "address": "江苏省常州武进市白云街44号",
            "id": 1,
            "name": "武进市 袁腾飞",
            "phonenumber": "13886666666"
        },

        {
            "address": "北京海淀区",
            "id": 4,
            "name": "北京海淀区代理 蔡国庆",
            "phonenumber": "13990123456"
        }
    ] , 
    'total': 2             
}

ret 为 0 表示登录成功,total 为 2 表示系统中全部(不仅仅是这一页)有多少客户,retlist 里面包含了所有的客户信息列表,每个客户信息以如下格式存储:

1
2
3
4
5
6
{
   "address": "江苏省常州武进市白云街44号",
   "id": 1,
   "name": "武进市 袁腾飞",
   "phonenumber": "13886666666"
}

添加一个客户

请求消息

1
2
POST  /api/mgr/customers  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带添加客户的信息,消息体的格式是json,如下示例:

1
2
3
4
5
6
7
8
{
    "action":"add_customer",
    "data":{
        "name":"武汉市桥西医院",
        "phonenumber":"13345679934",
        "address":"武汉市桥西医院北路"
    }
}

其中 action 字段固定填写 add_customer 表示添加一个客户,data 字段中存储了要添加的客户的信息。

其中 name 字段长度范围是 2-20,phonenumber 字段长度范围是 8-15,address 字段长度范围是 2-100。

服务端接受到该请求后,应该在系统中增加一位这样的客户。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果添加成功,返回如下:

1
2
3
4
{
    "ret": 0,
    "id" : 677
}

ret 为 0 表示成功,id 为添加客户的 id 号。

如果添加失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "客户名已经存在"
}

ret 不为 0 表示登录失败, msg 字段描述登录失败的原因。

修改客户信息

请求消息

1
2
PUT  /api/mgr/customers  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带修改客户的信息,消息体的格式是 json,如下示例:

1
2
3
4
5
6
7
8
9
{
    "action":"modify_customer",
    "id": 6,
    "newdata":{
        "name":"武汉市桥北医院",
        "phonenumber":"13345678888",
        "address":"武汉市桥北医院北路"
    }
}

其中 action 字段固定填写 modify_customer 表示修改一个客户的信息,id 字段为要修改的客户的 id 号,newdata 字段中存储了修改后的客户的信息。

服务端接受到该请求后,应该在系统中做相应修改。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果修改成功,返回如下:

1
2
3
{
    "ret": 0
}

ret 为 0 表示成功,如果修改失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "客户名已经存在"
}

ret 不为 0 表示失败, msg 字段描述添加失败的原因。

删除客户信息

请求消息

1
2
DELETE  /api/mgr/customers  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带要删除客户的 id,消息体的格式是 json,如下示例:

1
2
3
4
{
    "action":"del_customer",
    "id": 6
}

其中 action 字段固定填写 del_customer 表示删除一个客户,id 字段为要删除的客户的 id号。

服务端接受到该请求后,应该在系统中尝试删除该 id 对应的客户。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果删除成功,返回如下:

1
2
3
{
    "ret": 0
}

ret 为 0 表示成功,如果删除失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "id为 566 的客户不存在"
}

ret 不为 0 表示失败, msg字段描述添加失败的原因。

列出药品

请求消息

1
GET  /api/mgr/medicines  HTTP/1.1

请求参数

http 请求消息 url 中 需要携带如下参数:

  • action

    必填项,填写值为 list_medicine。

  • pagesize

    必填项,分页的每页获取多少条记录。

  • pagenum

    必填项,获取第几页的信息。

  • keywords

    可选项, 里面包含的多个过滤关键字,关键字之间用空格分开。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果获取信息成功,返回如下:

1
2
3
4
5
6
7
8
{
    "ret": 0,
    "retlist": [
        {"id":1, "name": "青霉素", "sn":"234324234234", "desc":"青霉素"},
        {"id":2, "name": "红霉素", "sn":"234545534234", "desc":"红霉素"}
    ] , 
    'total': 2            
}

ret 为 0 表示登录成功,total 为 2 表示总共有多少药品,retlist 里面包含了所有的药品信息列表,每个药品信息以如下格式存储:

1
{"id": 2, "name": "红霉素", "sn": "234545534234", "desc": "红霉素"}

添加一个药品

请求消息

1
2
POST  /api/mgr/medicines  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带添加药品的信息,消息体的格式是json,如下示例:

1
2
3
4
5
6
7
8
{
    "action":"add_medicine",
    "data":{
        "name": "青霉素",
        "desc": "青霉素 国字号",
        "sn": "099877883837"
    }
}

其中,action 字段固定填写 add_medicine 表示添加一个药品,data 字段中存储了要添加的药品的信息。

name 字段长度范围是 2-20,desc 字段长度范围是 2-500,sn 字段长度范围是 8-20。

服务端接受到该请求后,应该在系统中增加这样的药品。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果添加成功,返回如下:

1
2
3
4
{
    "ret": 0,
    "id" : 677
}

ret 为 0 表示成功,id 为 添加药品的 id 号,如果添加失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "药品名已经存在"
}

ret 不为 0 表示失败, msg字段描述添加失败的原因。

修改药品信息

请求消息

1
2
POST  /api/mgr/medicines  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带添加药品的信息,消息体的格式是json,如下示例:

1
2
3
4
5
6
7
8
{
    "action":"add_medicine",
    "data":{
        "name": "青霉素",
        "desc": "青霉素 国字号",
        "sn": "099877883837"
    }
}

其中,action 字段固定填写 add_medicine 表示添加一个药品,data 字段中存储了要添加的药品的信息。

name 字段长度范围是 2-20,desc 字段长度范围是 2-500,sn 字段长度范围是 8-20。

服务端接受到该请求后,应该在系统中增加这样的药品。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果添加成功,返回如下:

1
2
3
4
{
    "ret": 0,
    "id" : 677
}

ret 为 0 表示成功,id 为添加药品的 id 号,如果添加失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "药品名已经存在"
}

ret 不为 0 表示失败, msg 字段描述添加失败的原因。

删除药品信息

请求消息

1
2
DELETE  /api/mgr/medicines  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带要删除客户的 id,消息体的格式是 json,如下示例:

1
2
3
4
{
    "action":"del_customer",
    "id": 6
}

其中,action 字段固定填写 del_customer 表示删除一个客户,id 字段为要删除的客户的id号。

服务端接受到该请求后,应该在系统中尝试删除该 id 对应的客户。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果删除成功,返回如下:

1
2
3
{
    "ret": 0
}

ret 为 0 表示成功,如果删除失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "id 为 566 的客户不存在"
}

ret 不为 0 表示失败, msg 字段描述添加失败的原因。

列出订单

请求消息

1
GET  /api/mgr/orders  HTTP/1.1

请求参数

http 请求消息 url 中 需要携带如下参数:

  • action

    必填项,填写值为 list_order。

  • pagesize

    必填项,分页的 每页获取多少条记录。

  • pagenum

    必填项,获取第几页的信息。

  • keywords

    可选项, 里面包含的多个过滤关键字,关键字之间用空格分开。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果获取信息成功,返回如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
    "ret": 0,
    "retlist": [
        {id: 1, 
        name: "华山医院订单001", 
        create_date: "2018-12-26T14:10:15.419Z", 
        customer_name: "华山医院",
        customerid : 13,
        medicinelist: "[
            {\"id\":16,\"amount\":3,\"name\":\"环丙沙星\"},
            {\"id\":15,\"amount\":5,\"name\":\"克林霉素\"}
        ]"
        },
        {id: 2, 
        name: "华山医院订单002", 
        create_date: "2018-12-27T14:10:37.208Z", 
        customer_name: "华山医院",
        customerid : 13,
        medicinelist: "[
            {\"id\":16,\"amount\":4,\"name\":\"环丙沙星\"},
            {\"id\":15,\"amount\":5,\"name\":\"克林霉素\"}
        ]"
        }
    ]              
}

ret 为 0 表示登录成功,retlist 里面包含了所有的订单信息列表,每个订单信息以如下格式存储:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "id": 2, 
    "name": "华山医院订单002", 
    "create_date": "2018-12-27T14:10:37.208Z", 
    "customer_name": "华山医院",
    "customerid" : 13,
    "medicinelist":"[
        {\"id\":16,\"amount\":4,\"name\":\"环丙沙星\"},
        {\"id\":15,\"amount\":5,\"name\":\"克林霉素\"}
    ]"
}

其中 medicinelist 里面的 amount 表示药品数量 , id 表示药品的id, name 是药品名称,注意,这个 medicinelist 值是另外一个 json 格式的字符串。

###0 添加一个订单

请求消息

1
2
POST  /api/mgr/orders  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带添加订单的信息,消息体的格式是 json,如下示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "action":"add_order",
    "data":{
        "name":"华山医院订单002",
        "customerid":3,
        "medicinelist":[
            {"id":16,"amount":"5","name":"环丙沙星"},
            {"id":15,"amount":"5","name":"克林霉素"}
        ]
    }
}

其中,action 字段固定填写 add_order 表示添加一个订单,data 字段中存储了要添加的订单的信息。

订单名称 name 字段长度范围是 2-100,medicinelist 是订单中药品的信息列表,amount 表示数量,name表示名称。

服务端接受到该请求后,应该在系统中增加这样的订单。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果添加成功,返回如下:

1
2
3
4
{
    "ret": 0,
    "id" : 677
}

ret 为 0 表示成功,id 为添加订单的 id 号,如果添加失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "订单名已经存在"
}

ret 不为 0 表示失败, msg 字段描述失败的原因。

###1 删除订单

请求消息

1
2
DELETE  /api/mgr/orders  HTTP/1.1
Content-Type:   application/json

请求参数

http 请求消息 body 携带要删除订单的 id,消息体的格式是 json,如下示例:

1
2
3
4
{
    "action":"delete_order",
    "id": 6
}

其中,action 字段固定填写 delete_order 表示删除一个订单,id 字段为要删除的订单的id号。

服务端接受到该请求后,应该在系统中尝试删除该id对应的订单。

响应消息

1
2
HTTP/1.1 200 OK
Content-Type: application/json

响应内容

http 响应消息 body 中, 数据以 json 格式存储,如果删除成功,返回如下:

1
2
3
{
    "ret": 0
}

ret 为 0 表示成功,id 为添加订单的 id 号,如果删除失败,返回失败的原因,示例如下:

1
2
3
4
{
    "ret": 1,    
    "msg": "id为 566 的订单不存在"
}

ret 不为 0 表示失败, msg 字段描述失败的原因。

案例练习

  1. 创建一个集合(Collection),在该集合中创建一个 HTTP 请求,访问任意网站,并通状态码断言和包含指定字符串断言判断通信是否成功。

  2. 创建 http 请求,使用正确的账号密码登录系统,返回 ret:0 则表示登录成功。

  3. 创建 http 请求,列出所有客户。

  4. 创建 http 请求,添加一个客户,客户名为长沙市中心医院。

  5. 创建 http 请求,列出所有订单。

  6. 创建 http 请求,添加一个订单,订单中客户为长沙市中心医院。

  7. 创建 http 请求,添加一个订单,订单中客户为香港大学深圳医院。

  8. 创建 http 请求,将长沙市中心医院的订单删除。

Blog for Sandy Memories