大家一直都在说接口自动化,但对于接口测试的基础HTTP协议,你了解多少呢?
HTTP协议采用了请求/响应模型。客户端按照一定的规则请求,服务端响应对应的请求。HTTP协议的全名叫超文本传输协议,为英文HyperText Transfer Protocol,的缩写,是互联网上应用最为广泛的一种网络协议。
我作为APP测试人员,经常用fiddler抓包,比较好奇这些抓到的包,每项是什么含义,具体代表什么,那么我们就从一个fiddler应用每次打开默认的一个请求来学习下一个完整的HTTP请求包和响应包:
一、http请求包
请求行
第一行分别包含:请求方法、请求地址、请求协议;我们来一一了解。
1、请求方法
“GET”是请求方法里面的一种。根据HTTP标准,HTTP请求可以使用多种请求方法。
我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
我其实测试过程中见得最多的就是GET和POST,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
请求方法 备注
GET 请求指定的页面信息,请求不包含实体,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中,POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求,主要用于测试或诊断
2、请求地址
“https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False”,其实就是URL。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
1)模式/协议(scheme):它告诉浏览器如何处理将要打开的文件。最常用的模式是超文本传输协议(Hypertext Transfer Protocol,缩写为HTTP),这个协议可以用来访问网络。如“http://”表示超文本传输协议资源,“https://”表示用安全套接字层传送的超文本传输协议,“ftp://”表示文件传输协议……
2)文件所在的服务器的名称或IP地址,后面是到达这个文件的路径和文件本身的名称。服务器的名称或IP地址后面有时还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。“?”询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。
3、请求协议
“HTTP/1.1”,指的是请求协议。下面简单介绍三种版本的请求协议,目前无2.0版本,正在开发中。
HTTP/0.9 :只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0 :第一个在通信中指定的版本号,至今被广泛采用,特别是在代理服务器中。支持上面说到的,三种请求方法: GET, POST 和 HEAD方法
HTTP/1.1 :当前版本号,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。相对1.0版本,HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
请求消息头
第二行以后均表示消息头,
User-Agent:中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测。
Pragma:是 HTTP/1.1 之前版本的历史遗留字段。“Pargma: no-cache”只能用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。 但要整体掌握全部中间服务器使用 HTTP 协议版本确实不现实的。因此,发送的请求会同时含有 Cache-Control: no-cache和 Pragma: no-cache。
Host:访问的http服务器的域名/IP 地址和端口号。在http 1.1中不能缺失host字段,如果缺失, 服务器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值;在http 1.0中可以缺失host字段。
Accept-Language: 表示浏览器or客户端所支持的语言类型;
Referer:Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器以此可以获得一些信息用于处理。
Accept-Encoding: 浏览器支持的压缩编码。gzip,GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。deflate是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
Connection: 表示客户端与服务连接类型; close表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了
请求实体内容
上图中举的例子,实体内容为空行;原因是因为例子是get请求,是没有请求实体内容的。如果是post请求,实体内容一般格式如下:
name1=value1&name2=value2&name3=value3
二、http响应包
响应状态行
包含协议版本、状态码、原因短语,因为前面已经介绍了协议版本,在此不啰嗦,主要讲下状态码和原因短语:
用以表示网页服务器HTTP响应状态的3位数字代码,主要分为5类:
消息1xx(100~199,目前已经定义的有100~102):这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
成功2xx(200~299,目前已经定义的有200~207):代表请求已成功被服务器接收、理解、并接受。最常见的如:200 OK 请求已成功,请求所希望的响应头或数据体将随此响应返回。
重定向3xx(300~399,目前已经定义的有300~307):这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
请求错误4xx(400~499,目前已经定义的有400~449):代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。最常见的如:404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现。
服务器错误5xx、6xx:服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。最常见的如:500 Internal Server Error 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理,一般来说,这个问题都会在服务器端的源代码出现错误时出现。
响应消息头
Cache-Control:指定请求和响应遵循的缓存机制。
Content-Type:定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
Vary:Vary头域值指定了一些请求头域,这些请求头域用来决定当缓存中存在一个响应,并且该缓存没有过期失效,是否被允许去利用此响应去回复后续请求而不需要重验证(revalidation)
Server: 这个消息头提供所使用的Web服务器软件的相关信息。
其他几个字面意思能看懂,就不介绍了。
响应实体内容
大部分测试的平台,响应实体会以json格式返回,给前端处理。
未经授权,请勿转载,谢谢!