API接口测试

1、API接口概述

1.1、API接口是什么?

API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

举个例子:

我们来以一个常见的数学公式理解API,比如y=x+2,当x=2的时候,y=4,对么?

那此时,我们把y=x+2称为接口,x=2称为参数,y=4称为返回结果,那这个接口的功能就是能把我们输入的数加上2(注意:这里你可以发现接口自身是带有逻辑的)。

1.2、我们为什么需要API接口?

两个独立的系统,它们的数据或程序是独立的,这就使得它们无法直接访问对方的数据库或程序。但是某些业务场景下,独立的系统之间又必须相互共享数据或共用一套程序逻辑,如统一业务流程上的不同业务操作系统,下游系统的业务依赖于上游系统的数据。

既然如此为什么不把它们设计成一个系统,这样不就没有上面的问题了吗?

这是因为:一、有的业务流程很长很复杂,如果设计成一个系统,整个系统变得很庞杂,不论是功能设计、开发维护都很难。因此一般都会把虽然有上下游业务关系但又有清晰边界的业务划分成独立的系统实现,如采购系统和仓储系统。二、此外,很多时候我们需要获取的数据是我们外部其他公司拥有的数据,更不可能设计成同一个系统了。

举个例子:

比如打车的APP,现在需要在页面上展现地图的功能,对于公司而言,新做地图功能未免成本过高,那我们可以在高德开放平台或者百度地图的开放平台,找到地图API,这样的话我们只需要购买高德的服务,部署调用高德地图API,这样就可以快速在我们页面上线地图功能了。

2、认识API接口

2.1、API接口的类型

根据响应的机制可以分为同步接口、异步接口

  • 同步接口:

说明:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

比如:登录接口执行登录操作时,将用户名、密码、token等字段加密后通过接口校验,需要返回验证结果后,才能登录成功。

  • 异步接口:

说明:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

比如:在滴滴打车之后,司机点击结束行程后,不需要等待银行付款成功之后再开始下一个订单,我们看到的是我们已经付款成功(其实银行可能还没扣款),而滴滴后台会将这笔交易流水传给银行,在银行验证后再进行扣款、付款操作。

实时性要求高的且只能线性工作的需要采用同步接口,其他可以优先使用异步接口;当然不同的场景,同样的服务接口可能会被要求同步或异步

根据触发的形式可以分为分发接口、订阅接口

  • 分发接口

一个系统产生新数据的时候就分发给其它系统(也可以是多个)。

比如:电商网站后台的客户管理系统,在产生了一个新的黑名单客户的时候,就会将数据分发到订单、推荐等等各个系统,以便及时拦截这部分客户的订单。

  • 订阅接口

一个系统在需要的时候调用其他系统的接口进行数据订阅。

比如:订单系统生成订单时,因为很多外部系统可能需要及时获取订单状态信息。而订单系统也不知道要分发给哪些系统,这时候一般会将订单推送至特定的消息队列,比如KFK,其他由需要跟进订单状态的系统订阅KFK消息后,可以即使获取订单完成信息,进行触发下一个动作。

2.2、API接口的通信协议

结合接口的不同类型和实时性要求两方面,可以选择合适的接口实现方式

  • mq消息队列

是一个中间件,数据提供方将数据放到中间件,数据获取方从中间件中获取数据。针对向多个系统同步基础数据的需要,消息队列是最适合的方式。

若选择这种同步方式,要注意的一点是:增量同步还是全量同步,若是增量同步,对方是增量获取还是全量获取?若是全量同步,在什么情况下,对方应该更新数据,什么情况下应该更新数据?

  • otter同步

数据同步方直接访问数据获取方的数据表将数据写入对应的表中,这种方式实时性最高,若对数据的准确性要求很高,此方式是很好的数据同步方式。

  • http/https

调用第三方平台接口需要进行系统间的通信,目前常用的协议是http和https;简单理解https是http的加密版,可以将用户到服务端请求的信息进行加密,避免因明文传输被截获而获知用户信息。

在设计具体的数据同步接口时,具体的方式产品经理不用关注,由开发根据需求设计合理的方式,然后产品可帮助开发一起确定所选方式是否满足业务需要。除非业务上有特殊要求,则在需求中可指定具体的方式。

2.3、API接口的请求方式

基于http协议常见的请求方式包括:get(查)、post(增)、还有put(改)、delete(删)、patch等,接口所属的请求类型是由业务决定的。比如打开淘宝,展示的首页内容就需要用到get接口,获取页面信息,你看中了商品要下单,添加你的收获地址时,用的则是post接口。而这两种也是其中最常见的两种接口类型。

  • get型接口

格式:get请求方式是将请求参数放到url中,用”?”连接,多个参数之间用”&”连接。

场景:get型接口用于获取信息,多用于查询数据,如菜单列表展示,搜索展示,订单查询,优惠券查询等需要其他系统返回数据时使用。一般情况下请求的数据量较小,返回速度快,不过接口是暴露在外面的,所以会有一定的风险。

  • post型接口

说明:post请求方式是将参数放到requst body中,向指定资源位置提交数据来进行请求,post请求可能会导致新资源的建立。

场景:如注册、上传、发帖等功能,这种请求数据量大,安全性要求高。

其他接口类型如put(改)、delete(删)、patch等使用评率稍低一些,此处不再赘述。

2.4、API接口的安全性校验

完成接口逻辑开发后,接下来要考虑的就是安全性问题了,接口的安全性问题主要来源于几方面考虑:

  • 请求来源是否合法?

即接口的伪装攻击,因为接口是对外的,在外网环境中,接口地址是暴露的,收到的请求有可能是恶意非法请求;如果真的是合法请求,也需要知道这个请求的来源,同时这个请求来源不能否认。这里引入“签名”的概念,以及签名的防伪装及抗否认性特性。

近些年各大企业强制使用https替换掉原有的http接口,正是因为https所使用的的证书安全性更高。

  • 请求是否会被篡改,返回数据可能会被截取

因为接口是对外的,所以接收请求和返回数据的时候,是不可能使用明文方式传输的,否则一旦被恶意截取,会造成极大风险。所以请求数据及返回数据都是需要加密的,这样即使数据被截取,也不用泄露数据的内容。

如果是用户账号相关,现在会使用token加密用户信息,用户请求身份信息时,服务端会分配token存在缓存中,后续请求会将token与时间戳一起打包加密,这样即使请求数据被截获,因为不知道token的值,数据也不会被解析出来。

  • 如何防范接口的重放攻击,防重放攻击是什么呢?

就是把你的请求原封不动地多次发放,请求都会通过验证进入到正常逻辑中,会造成服务端接口拥堵并且会造成实际损失。

防重放一般需在请求参数加上 时间戳 + 随机数,通过时间戳确保接口是最新的请求,而随机数相同则可以认定为是重放攻击。

2.5、API接口的性能

如果是访问量比较大的接口,在上线前肯定需要进行压力测试。因为普通的开发自测和生产模拟是不能推算出高并发时候接口是否可正常运行。

  • QPS

Query Per Second 每秒系统处理的交易或事物的数量,衡量系统处理能力(并发数)的重要指标。

  • RT

响应时间,从客户端发送一个请求开始,到客户端接收到从服务器返回的响应结果结束所经历的时间,包括请求发送时间,网络传输时间和服务器处理时间三部分。

  • 线程

一个程序有多个进程,一个进程有多个线程。

如果把上课的过程比作进程,那么每个学生就是一个线程,CPU是老师,教室是内存,他们共享教室,即线程共享进程的内存空间。每一个时刻,只能一个学生问老师(CPU)问题,老师回答完毕,接着回答下一个学生问题。

用户的RT响应时间自不必说,时间太久伤用户体验;QPS则是高并发的指标,一般提供服务的接口,需要考虑到最极端情况下的并发数,这些数量一般来自于运营的活动策划和往期的数据趋势预估,以此为依据,保证自己的接口可以支持最高的并发数,而验证这些使用的一般是压力测试。如:正常情况下压测时TPS可以达到2000时接口正常,就可以保证2000的实际并发。

3、认识接口文档

3.1、API接口文档的结构

通常来说,一份API文档内会包含多个API的信息,单个API的信息通常包括以下内容:

  • 接口描述:

简单描述接口的逻辑和作用,这个接口是用来干嘛的,以及相关的规则

  • 接口地址:

顾名思义就是接口的地址,包含接口的正式url和接口测试的url,通过调用接口url,获取响应内容

  • 请求方法:

常用的有post和get两种方式,一个是读接口(常用get),一个是写接口(常用post),通过这两种方式,实现对数据的增删查改。增删改本质都是写的动作。

  • 请求参数:

请求该接口时,需要提供的参数,参数属性包括名称、类型、是否必填、描述等

  • 返回参数:

接口正常响应后,返回的字段数据内容

  • 错误代码:

接口请求失败后,对接口的错误用代码进行归类,以便能快速找到错误原因,解决问题

3.2、产品阅读API接口文档的好处

  • 明确各个系统之间的数据流转,特别是功能系统的产品经理,只有在知道了功能设计的目的、需要对外提供什么样的接口服务,需求设计阶段才能够考虑得更加全面
  • 掌握开发总体工作量,而不局限于功能;另外,在安排项目计划时能够考虑到与周边系统联调的时间,计划安排才会更加合理;
  • 识别项目中的关键风险点,特别是一些关键接口、数据量大需要进行大数据压测的接口,需要尽早安排联调和测试,并且对周边配合的项目提出要求

你可能感兴趣的:(java,大数据,前端)