1.接口定义与http协议

接口定义

接口是个比较泛义上的概念,主要表示系统对外交互的部分,比如电源插座是电器和电能之间的接口,图形界面是应用软件和用户的接口,医院挂号大厅是医生和病人之间的接口

webAPI

我们要学习的接口概念缩小到web系统提供的对外消息交互接口,通过发送对应的请求给服务器,服务器会返回相应的结果,因为其调用模式非常像编程语言中的API,所以web消息交互接口又叫webapi。

Web服务接口

目前web服务接口都是基于http协议传递消息

通常大家所说的,web服务接口,websevice ,webapi其实表示的都是一个意思

主流的http消息体类型主要分为两种

SOAP UI: 使用XML格式传输消息体,由于阅读性差,同等信息量传输耗费的资源多,因为标签

REST: 定义了一种消息传输的风格,规定了消息体和URL的请求格式,同时也规定服务端的开发设计架构。本质上还是用http协议传输消息,至于这种风格具体是什么,怎么就确定我开发的系统符合REST定义的风格规范,很多做了很多年服务端开发的人员也不一定能说清楚,由于没有强制的要求,即使开发的服务没有完全符合REST风格规范,也可以使用

所以我们也不需要了解到底REST风格是什么样子的,可能你们有疑惑,这个也不了解那么我们怎么测试webapi呢

其实我们只要知道,不管系统处于那种设计风格,只要是基于HTTP协议,我们就能对他进行测试

只要是发送数据交互过程有来有往,我们就可以用通用的方法来测试这个系统

webAPI 测试特点

通常系统内部的接口是不需要QA测试的,如果测试需要提供API文档,因为这是一个判断api是否符合需求的标准。

即使要测试内部接口,多数也不是从功能的角度来测试,而是以安全的角度。

对外暴露的接口必须要对其进行测试,如果提供API文档,那么测试人员需要自己准备文档,然后提交给开发进行评审。

HTTP协议基础

http与html的关系

新学习web的人经常混淆的两个名词就是HTTP和HTML,

都是姓H的,都是互联网领域的名词。很容易混淆。

HTML是一种用来定义网页的文本语言,

会HTML,就可以编写网页;

我们访问百度得到的内容是html,大家可以打开浏览器查看源码看到HTML

HTTP是在网络上传输信息(当然也包括HTML)的协议,通常用于浏览器和服务器的通信。

两者的关系做个类比,一个好比快递的商品(HTML),一个好比运输商品的方式(http)

快递盒子既可以包装手机也可以包装其他商品,什么类型的信息都是不限制的

http请求

http请求消息包含如下内容

l 请求行(必须包含)

是http请求的第一行的内容,表示操作什么资源,通过什么http协议版本去获取

例如GET /images/logo.gif HTTP/1.1,

表示从/images目录下请求获取logo.gif这个文件。

再比如

POST / HTTP/1.1

表示向这个url地址 / 提交信息。

GET POST是请求的方法,我们后面会进一步讲解

l 请求头(必须包含)

例如Accept-Language: en

可以有好多个,比如

接下来http请求消息里面可能还有

l 空行(非必须)

l 消息体(非必须)

空行的主要目的是隔开消息头和消息体的

所以:

请求行和请求头是必须有的。

空行和消息体可能有也可能没有。

一个GET请求消息的例子如下

GET/index.htmlHTTP/1.1

Host: www.example.com

这个例子里面包括请求行和一个请求头,没有消息体。

一个POST请求消息的例子如下(注意请求头和消息体之间的空行)

POST / HTTP/1.1

Host: foo.com

Content-Type: application/x-www-form-urlencoded

Content-Length: 13

say=Hi&to=Mom

请求行

请求行在第一行,包含

l 请求的方法

请求的方法,表示请求的动作是获取信息、还是提交信息,还是修改信息、还是删除信息等。。

常见的有 GET,POST,PUT,DELETE

GET

请求获取Request-URI所标识的资源

就是向uri指定的资源发出“获取”请求。使用GET方法一般用在读取数据,

这应该是一种最常见的请求了。

POST

表示在Request-URI所标识的资源后附加新的数据

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。

数据被包含在请求消息中。这个请求可能会创建新的资源或修改现有资源。

PUT

向指定资源位置上传其最新内容。通常用于更新修改部分资源信息。

DELETE

请求服务器删除Request-URI所标识的资源。

请求头字段 (request headers)

http的请求头用来表示请求的其它信息。

格式是:大小写不敏感的名字+冒号+空格+值

就像键值对,一个名字一个值,一个名字一个值

很多标准的请求头字段是由国际标准化组织制定的

https://tools.ietf.org/html/rfc4229

常见的请求头字段

Accept-Encoding:

例:

Accept-Encoding:gzip, deflate, br

表示客户端所支持的解码(解压缩)格式。

网路数据的传输都是占据带宽的,而将文件数据压缩能够降低数据量,减少传输时间。所以服务器在返回数据给客户端时,常常对数据进行压缩(对用户透明,通常由服务器或代理来做),而压缩的方式有多种,到底采用哪一种则需要看客户端支持哪种解码方式,这时候就可以根据header中Accept-Encoding的值。

文件或数据的压缩,由服务器或代理来做,一般不需要程序员干预;客户端接收到数据时解压缩,通常由浏览器自动完成,对用户透明。

对于我们主动发起的ajax请求,一般数据量较少,不需要设置该字段。

Accept-Language:

Accept-Language:zh-CN,zh;q=0.9

表示客户端支持的语言格式(不是编码格式),如中文/英文,通常浏览器直接发起请求时,浏览器会根据被设置的语言环境(默认语言),来附加上该字段。

一般我们服务器解析报文时,是不理会该字段的。

他的使用场景可以是这样的,假如有个文件,有各种语言的版本,这样当不同请求发来时,我们可以根据Accept-Language的值来判断到底返回哪种语言版本给客户端。

(其实这种应用场景也一般不采用判断Accept-Language字段的方法,不靠谱,还不如直接在url中体现语言版本呢)

Accept-Charset:

例:

Accept-Charset:gbk,utf-8;q=0.8

表示客户端支持编码格式。服务器在返回报文时,需要将字符按照一定的编码格式转换为字节序列发送给客户端,那么该采用哪种编码格式呢?

当然作为服务器端,他可以采用任何一种编码方式,客户端都得完完整整的接收响应报文。因为目前客户端几乎都支持常见编码类型,所以服务器在返回数据时,只需要按照既定的编码方式编码,然后在响应报文中告知客户端所使用的编码方式。这样客户端在接收到报文后按照该方式进行解码,就就不会出现乱码问题。

但是,如果客户端已经定了就使用某种解码方式,那么这时候服务器端就不能那么任性了,他就需要解析Accept-Charset字段,根据这个值,来设定采用的编码方式。

如上例中,以逗号分隔,客户端支持两种编码方式,gbk和utf-8(gbk优先级高于utf8),其中utf-8后的q值,表示utf-8占的“权重”。

---------------------

User-Agent:

例:

User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

表示客户端的软件环境。如上可以看出使用的是Window10 64位操作系统,Chrome浏览器等信息。服务器可以根据该字段评估客户端的环境从而给出不同的响应。(比如根据请求是从手机端或是电脑端发起的,返回不同版本的页面)

Host:

例:

Host:localhost:8080

表示请求者的主机地址(IP地址)和端口号。

服务器端可以根据该字段进行ip过滤等操作。

Content-Type

例子:

Content-Type :application/x-www-form-urlencoded

表示请求体的消息类型 (用于POST和PUT请求中)

常见的有x-www-form-urlencoded格式json格式还有xml格式

请求消息体

很多时候,http请求是需要请求消息体的,比如POST、PUT等请求。

Get通常是不需要消息体的。

post、put提交信息,会把消息内容翻到请求体里面。

请求消息体中保存了要提交给服务端的数据信息。

常见的消息体格式就三种,json,xml,www- form-urlencoded

其中最常见的就是json是后面课程的重点

json用来传递稍微复杂的数据

传递简单的用 www-form-urlencode

http响应

HTTP响应消息包含如下内容

l 状态行

l 响应头

l 空行

l 消息体

状态行和响应头是必须有的。

空行和消息体可能有也可能没有。

状态行

状态行在第一行,包含协议版本状态码和描述状态的短语

比如

HTTP/1.1 200OK

我们重点来看一下状态码,它表示客户端的的请求结果如何

  • 1xx消息——请求已被服务器接收,继续处理

(这类不常见,先忽略过去)

  • 2xx成功——请求已成功被服务器接收、理解、并处理

(最常见的就是200,抓包给大家看看)

  • 3xx重定向——需要后续操作才能完成这一请求

(在webapi中不常见)

就像店面移到新的地址,会贴一个告示,小王理发店已经移到。。

301 Moved Permanently永久性移动到新地址,再访问这个资源,就直接用新地址。比如小王理发店永久性移动到西街。。

如果下次访问,可以直接去西街

302 Moved Temporarily这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求

小王理发店,只是暂时的装修,临时移到西街,以后还会移回来,下次应该还是先去东街看看。

304 Not Modified

表示资源未被修改,因为请求头指定的版本If-Modified-Since或If-None-Match。在这种情况下,由于客户端仍然具有以前下载的副本,因此不需要重新传输资源

现代的浏览器经常缓存资源数据,如果资源未被修改,通常不需要服务端传回全部的资源信息。节省效率和带宽。

其它的 30x不是特别常见,感兴趣的可以自己去学习。。

转发与重定向区别

https://www.cnblogs.com/ChrisMurphy/p/5059940.html

4xx请求错误——

这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。

400 Bad Request

401 Unauthorized未认证

403 Forbidden认证了,但是没有相应的权限

404 Not Found,访问http://ci.ytesting.com/portal/home33.html

常见错误,大家访问博客的时候,有时候遇到帖子被删了,或者文章的url发生了变化,用原来的地址访问就会出现这种情况

  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。

500 Internal Server Error服务端的代码错误导致,通常是一个异常抛出了

503 Service Unavailable

由于临时的服务器维护或者过载(比如被攻击导致服务端的防御措施),服务器当前无法处理请求。这个状况是暂时的,并且将在一段时间以后恢复。

响应头字段 (response headers)

http的响应头用来表示响应的其它信息。

格式和请求头类似,有很多可以共用的字段。

Content-Type:text/html;charset=utf-8

消息体的数据格式,这个是经常使用的,

Content-Length表示请求消息体的长度

Date:Sun, 30 Jul 2017 08:25:37 GMT表示响应消息发送的日期时间

其他常用的响应头感兴趣的可以参考网上的信息,后面的课程会一一说到

响应消息体

很多时候,http响应是需要消息体的。比如请求一个网页的内容,那么我们网页的html内容就在响应的消息体中给出。

fiddler抓包工具

百度搜索 fiddler,https://www.telerik.com/fiddler

安装下载

随便填写

安装后打开,界面如下:

左边是抓到的http请求和响应,右边可以显示其具体信息。

fiddler抓包原理是作为代理监听了浏览器到web服务器之间的http通信请求

如图:

上面浏览器和服务器之间没有代理,抓不到包

下面浏览器和服务器之间加了代理,可以抓包

fiddler作为代理的 ip和端口是

tools-> options

动的时候,会修改系统代理设置,把自己设置为系统代理

如果我们要使用fiddler抓 web网站前后端的包,就要保证浏览器会使用 fiddler作为 proxy

有的浏览器比如火狐,不一定使用系统代理,可以手动设置浏览器代理为Fiddler的代理

抓个包看看。

这个inspector是查看内容

看raw部分

如果这样,很多包都抓了,有些包不是我们关心的。

我们可以设置过滤条件,根据host过滤

locahost; httpbin.com

甚至根据url路径过滤

原文地址:https://www.cnblogs.com/Chamberlain/p/10807648.html

时间: 2024-09-30 15:08:00

1.接口定义与http协议的相关文章

glib实践篇:接口定义与实现

前言: 在上一篇讲解了基于glib实现抽象和继承后,当然这篇就得讲讲接口类型啦! 在JAVA中接口更多的弥补了其单继承所带来的缺陷,使其能够扩展很多功能,同时又不破坏它的结构.其实接口就是一种协议,在A类不能直接调用B类方法.尽量降低耦合性和避免杂糅混乱等情况下便可以使用接口来建立之间的联系.同样,本篇以一个简单的C语言例子来进行接口的实现. 开发环境: eclipse集成开发环境.glib库.ubuntu操作系统. 设计流程: 1.定义一个test接口类,定义4个接口方法 2.定义一个test

stm32的swd接口的烧写协议是否公开的呢?

stm32的swd接口的烧写协议是否公开的呢? 需要用一台好的示波器来抓才能有足够的存储深度,保证你能够过滤掉那个该死的50clock. 按照Arm的手册,每次转换发送方都需要一个TNR---但是我观察JLINK的波形却没有那个该死的TNR. 手册中说异步SWD需要,同步不需要----或者相反,但是我没有找到关于同步异步的描述. 姑且不管他,反正目前忽略掉TNR就能够读到该死IDR. 另外JLINK的复位时序很奇怪,大致是 70clk High,0xe79e(注意,SWD是LSB First),

osi七层模型,定义及常用协议

一.OSI七层参考模型的含义应用层:网络服务与最终用户的一个接口 表示层:数据的表现形式,如加密.压缩. 会话层:建立.管理.中止会话,例如断点续传. 传输层:定义传输数据的协议端口号,以及流控和差错校验,实现了程序与程序的互连,可靠与不可靠的传输. 网络层:进行逻辑地址寻址,实现不同网络之间的通信,定义了IP地址,为数据传输选择最佳路径,路由器工作在网络层. 数据链路层:建立逻辑连接.进行硬件地址寻址.差错校验等功能.通过MAC地址实现数据的通信,帧包装.帧传输.帧同步.交换机工作在数据链路层

JAVA8新特性——接口定义增强

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 接口定义增强 在JDK1.8以前,接口是定义的: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 在JDK1.8之前,接口有如下特性: 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错). 接口中

第37条:用标记接口定义类型

标记接口是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口.考虑Serializable接口,通过实现这个接口,类表明它的实例可以被写到ObjectOutputStream. 标记接口相比标记注解的优点: 1.标记接口定义的类型是由被标记类的实例实现的:标记注解则没有定义这样的类型. 2. 可以被更精确地进行锁定.如果注解类型利用@Target(ElementType.TYPE)声明,它就可以被应用到任何类或者接口,假设有一个标记只是适用于特殊的接口实现,但它却可以被应用到类,如

我的编码习惯 - 接口定义

原文出处: 晓风轻 工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口.接口定义一定程度上能反应程序员的编程功底.列举一下工作中我发现大家容易出现的问题: 1. 返回格式不统一 同一个接口,有时候返回数组,有时候返回单个:成功的时候返回对象,失败的时候返回错误信息字符串.工作中有个系统集成就是这样定义的接口,真是辣眼睛.这个对应代码上,返回的类型是map,json,object,都是不应该的.实际工作中,我们会定义一个统一的格式,就是ResultBean,分页的有另外一个

4. Dubbo原理解析-代理之接口定义 (转)

转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 一:ProxyFactory的接口定义 import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.extension.Adaptive; import com.alibaba.dub

Java接口定义和实现

1. 使用interface来定义一个接口.接口定义类似类的定义,分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: 1 [修饰符] interface 接口名 [extends 父接口名列表]{ 2 [public] [static] [final] 常量; 3 [public] [abstract] 方法; 4 } 修饰符:可选参数public,如果省略,则为默认的访问权限: 接口名:指定接口的名称,默认情况下,接口名必须是合法的Java标示符,一般情

Java 8新特性-接口定义增强

为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的  默认方法: Java 8 还允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法. 在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法. 但扩展方法不能够重载 Object 中的方法.例如:toString