一,关于接口的概念
接口底层服务架构
设计底层服务架构有两种风格,一种是当下最流行的Restful,另一种是老牌的webservice,
Restful:REST是一种架构风格,其核心是面向资源,遵循CRUD原则,这个原则告诉我们对于资源只需要4种行为,分别是:创建,获取,更新和删除,并且这些资源执行的操作时通过HTTP协议规定的;REST简化开发,我们可以通过统一资源标识符(Universal Resource
Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。
Webservice:WebService底层是SOAP协议,核心是面向活动, SOAP webService有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。
本文章所指接口主要是指Restful架构风格的接口;
什么是接口(API)
API全称Application Programming Interface,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。这里面我们其实不用去关注AP,只需要关注I上就可以。一个API就是一个Interface。我们无时不刻不在使用interfaces。我们乘坐电梯里面的按钮是一个interface。我们开车一个踩油门它也是一个interface。我们计算机操作系统也是有很多的接口。
API的位置
在互联网应用程序中,API就是作为一个连接前端与后端的一个桥梁,或者通道;如下图所示,API的位置;
二,为什么要做接口测试
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前端太容易了),
需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。
如今系统越来越复杂,传统的靠前端测试已经大大降低了效率,而且现在我们都推崇测试前移,希望测试能更早的介入测试,那接口测试就是一种及早介入的方式。例如传统测试,你是不是得等前后端都完成你才能进行测试,才能进行自动化代码编写。
而如果是接口测试,只需要前后端定义好接口,那这时自动化就可以介入编写接口自动化测试代码,手工测试只需要后端代码完成就可以介入测试后端逻辑而不用等待前端工作完成。
三,单个接口请求的构成
1,请求URL
我们日常访问的每一个网站地址;在RESTful架构中,每个网址代表一种资源,REST其实并不是什么协议也不是什么标准,而是将Http协议的设计初衷作了诠释,Restful接口请求的URL结构就是http协议结构,,结构如下:
schema://host[:port]/path[?query-stringl][#anchor]
scheme:指定底层使用的协议(例如:http,https,ftp)
host:服务器的IP地址或者域名
port:服务器端口,默认为80,https默认端口为443
path:访问资源的路径
query-string:发送给htp服务器的数据
anchor:锚,后台一般不用管,前端用来做页面定位的。
举一个例子,上图中的接口URL:,其中,http就是scheme;pro.imprexion.cn就是host;
由于http协议端口默认是80端口,如未指定定义其它端口,则可以不用填写,就是80端口;/imprexion/androidAd/createAdPlan就是path; 上面这个接口是POST请求方法,查询的数据参数一般不会出现在请求URL中,故这里没有;anchor不用管;
2,请求方法
[if !supportLists]1) [endif]GET;
从服务器取出资源(一项或多项)。
[if !supportLists]2) [endif]POST;
在服务器新建资源
[if !supportLists]3) [endif]HEAD;
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
[if !supportLists]4) [endif]PUT;
在服务器更新资源
[if !supportLists]5) [endif]DELETE;
从服务器删除资源。
[if !supportLists]6) [endif]OPTIONS;
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
[if !supportLists]7) [endif]TRACE;
回显服务器收到的请求,主要用于测试或诊断
[if !supportLists]8) [endif]CONNECT;
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
3,请求头
常见的请求头如下:
Accept:浏览器可接受的MIME类型;
Accept-Charset:浏览器可接受的字符集;
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
Content-Length:表示请求消息正文的长度;
Cookie:这是最重要的请求头信息之一;
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;
Host:初始URL中的主机和端口;
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;
请求头参数太多,大部分在实际测试单个接口的过程中用不到,我们只需要关注两个参数,Accept-Charset,浏览器可接授的字符类符集,Authorization,授权信息;调用接口的时候,如没有特殊说明,请求头只需要传这两个参数就行;两个参数在不同的开发手中,定义的可能不一样,如我们后端的接口,定义的这两个参数分别是:Content-Type和Authorization,Android端是Content-Type和token;
4,请求消息体
请求体的格式主要看编码时的定义;http协议接口请求体报文一般都是键值对,即Key-value,某些特殊情况的键值对,就是在上传文件时,如上传图片,文本等key的类型是file;
如果请求中的文本类型Content-Type为multipart/form-data,则请求体中可以上传键值对,也可以上传文件,有分割符隔离,可以上传多个文件或者键值对;
如果请求中的文本类型Content-Type为application/x-www-form-urlencoded,则会自动将表单内的数据转换为键值对,比如,name=admin&pwd=admin;
如果是raw类型,则可以上传倾任意的文本内容,格式就按照相应的文本格式填写即可;如JSON,TEXT,XML,JAVASCRIPT,HTML;
如果请求的类型为Content-Type:application/octet-stream,则只能上专二进制数据,并且只能以文件的形式,这种情况没有键值对,一次只能上传一个文件;
5,响应状态码
1**:请求收到,需继续处理;
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
2**:操作成功收到,分析、接受
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过
的文件
206——服务器已经完成了部分用户的GET请求
3**:完成此请求必须进一步处理
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
4**:请求包含一个错误语法或不能完成
400——错误请求,如语法错误
401——未授权
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或CGI 授权失败
402——保留有效ChargeTo头响应
403——禁止访问
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
404——没有发现文件、查询或URl
5**:服务器执行一个完全有效请求失败
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误- ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
6,响应消息体
响应消息体通常包含一个响应code,描述信息及响应数据,数据格式默认为json,可根据需要更改展示的数据格式;
7,响应消息头
HTTP最常见的响应消息头如下:
Allow:服务器支持哪些请求方法(如GET、POST等);
Content-Encoding:文档的编码(Encode)方法。只有在解
码之后才可以得到Content-Type头指定的内容类型。
Content-Length:表示内容长度。只有当浏览器使用持久
HTTP连接时才需要这个数据。
Content-Type: 表示后面的文档属于什么MIME类型。
Date:当前的GMT时间。
Expires:指明应该在什么时候认为文档已经过期,从而不
再缓存它。
Last-Modified:文档的最后改动时间。
Location:表示客户应当到哪里去提取文档。
Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。
网友评论