协议学习地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html
本篇学习笔记来自于慕课网上学习JMeter的学习笔记
学习的内容包括:
1.不同角色眼中的接口(主要是指开发测试两个角度)
2.常见的接口协议
3.HTTP协议栈中的位置
4.HTTP协议响应码
5.HTTP协议响应模型
6.常见的HTTP协议的请求方式
7.JMeter的功能介绍
8.get与post请求
一、不同角色眼中的接口
对于开发者而言,接口是模块与模块之间对接的方式的定义,可以简单的认为接口就相当于一个类、对象或者函数
对于测试者而言,接口更多是指可以独立部署成服务的协议接口,具体是指协议的接口
二、常见的接口协议
HTTP:超文本传输协议
HTTPS:安全超文本传输协议(例如百度)
FTP:文件传输协议
TCP:网络控制协议
IP:互联网协议(合并即为TCP/IP协议)
UDP:用户数据协议(例如QQ,微信)
三、HTTP协议栈中的位置
从图中可以看出HTTP和HTTPS之间的区别,他们的底层都是差不多的,区别就在于中间,HTTP是TCP,而HTTPS是SSL/TLS(安全套接层/安全传输协议)
四、HTTP协议响应码
1xx:信息响应类,表示接受到了请求,并需要继续处理,这是一种中间状态,(很少关注)
2xx:处理成功响应类,表示动作被成功的接收、处理和接受(200成功的状态)
3xx:重定向响应类,为了完成某一动作,必须进行进一步的处理
4xx:客户端错误响应类,客户请求包含语法错误,或者不能正常的执行(404请求资源不存在,首要的解决方法就是查看自己请求的URL路径是否正确,再者就是查看自己的应用程序中是否有语法,代码的错误)
5xx:服务端错误响应类,服务器不能正确的执行正确的请求(一般在a测试下,可以使用重启服务器的方法解决,但是很多这样的问题可能就是之前的一些bug所导致服务器不能正确的执行,从而导致服务器不能执行正确的请求)
下面举个例子来理解重定向和客户端错误:
这里有a,b,c三个人,a向b借钱,但是因为b没有钱,所以b就对a说,你向c借吧,我现在没有钱(这就可以简单的理解为重定向)
a向b借钱,a去b的家里找b,但是由于a找错了b家,并没有找到b(这就可以简单的理解为客户端错误类)
开发中常见的响应码及含义:
200 OK:这表明该请求被成功地完成,所请求的资源发送回客户端
302 Found:重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request
304 Not Modified:代表上次的文档已经被缓存了, 还可以继续使用【如果你不想使用本地缓存可以用Ctrl+F5 强制刷新页面】
400 Bad Request :客户端请求与语法错误,不能被服务器所理解
403 Forbidden :服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在(输错了URL)
500 Internal Server Error: 服务器发生了不可预期的错误
503 Server Unavailable: 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
header也是我们接口测试中需要关注和了解的,下面来看看接口请求中header相关的知识要点,header主要有氛围request header和response header
具体关于协议相关的知识,我们可以参考小坦克的:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html
request header
Cache 头域
If-Modified-Since
作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"
Pragma
作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样,Pargma只有一个用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control
Cache-Control
作用: 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下
Cache-Control:Public 可以被任何缓存所缓存()
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
Client 头域
Accept
作用: 浏览器端可以接受的媒体类型,
例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)
通配符 * 代表任意类型
例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
Accept-Encoding
作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
例如: Accept-Encoding: gzip, deflate
Accept-Language
作用: 浏览器申明自己接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language: en-us
User-Agent
作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset
作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);
Cookie/Login 头域
Cookie
作用: 最重要的header, 将cookie的值发送给HTTP 服务器
Entity头域
Content-Length
作用:发送给HTTP服务器数据的长度。
例如: Content-Length: 38
Content-Type
作用:决定如何展示返回的消息体内容
例如:Content-Type: application/x-www-form-urlencoded
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml : XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json : JSON数据格式
- application/pdf :pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
Miscellaneous 头域
Referer
作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Transport 头域
Connection
例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Host(发送请求时,该报头域是必需的)
作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:http://www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号
response header
Cache头域
Date
作用: 生成消息的具体时间和日期
例如: Date: Sat, 11 Feb 2012 11:35:14 GMT
Expires
作用: 浏览器会在指定过期时间内使用本地缓存
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Vary
作用:
例如: Vary: Accept-Encoding
Cookie/Login 头域
P3P
作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
Entity头域
ETag
作用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
例如: ETag: "03f2b33c0bfcc1:0"
Last-Modified
作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type
作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length
指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
例如: Content-Length: 19847
Content-Encoding
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
例如:Content-Encoding:gzip
Content-Language
作用: WEB服务器告诉浏览器自己响应的对象的语言者
例如: Content-Language:da
Miscellaneous 头域
Server
作用:指明HTTP服务器的软件信息
例如:Server: Microsoft-IIS/7.5
X-AspNet-Version
作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319
X-Powered-By
作用:表示网站是用什么技术开发的
例如: X-Powered-By: ASP.NET
Transport头域
Connection
例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Location头域
Location
作用: 用于重定向一个新的位置, 包含新的URL地址
实例请看304状态实例
五、HTTP协议请求响应模型(可以说是一次请求的生命周期,或者是软件分层)
六、常见的HTTP协议请求方式
HTTP 1.1协议中共定义了八种方法,有时也叫做动作来表明Request-URL指定的资源的不同请求方式
1.OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法
可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
2.HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。
这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在相应小消息头中的元信息。
3.GET
向特定的资源发出请求。
注意:GET方法不应当被用于产生“副作用”的操作中,例如Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问
4.POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
5.PUT
向指定资源位置上传其最新的内容
6.DELETE
请求服务器删除Request-URL所标识的资源
7.TRACE
回显服务器收到的请求,主要用于测试或诊断
8.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
GET和POST简要的区别
GET请求:
url:http://127.0.0.1:8080?userName=zhangsan&password=123
POST请求:
url:http://127.0.0.1:8080
请求体:
{
[
"userName":"zhangsan",
"password":"123"
]
}
GET和POST究竟有什么区别?
1.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数;
2.GET在浏览器回退时是无害的,而POST会再次提交请求;
3.GET产生的URL地址可以被Bookmark(作为书签),而POST不可以;
4.GET请求会被浏览器主动cache(缓存),而POST不会,除非手动设置;
5.GET请求只能进行url编码(就是对非字母数字的字符借助utf-8或gbk来编码,如华仔URL编码后变为%E5%8D%8E%E4%BB%94,
使用这种方式来解码:decode = URLDecoder.decode("http://www.dbank.com/documents/%E5%8D%8E%E4%BB%94.jpg","UTF-8"); ),而POST支持多种编码方式;
6.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;
7.GET请求在URL中传送的参数是有长度限制的,而POST么有;
8.对参数的数据类型,GET只接受ASCII字符,而POST没有限制;
9.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息;
10 GET参数通过URL传递,POST放在Request body中;
其他:
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET产生一个TCP数据包;POST产生两个TCP数据包
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。因为:
1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
详情请看:http://www.techweb.com.cn/network/system/2016-10-11/2407736.shtml
注意:
1)方法名称是区分大小写的,
当某个请求所针对的资源不支持所对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);
当服务器不认识或者不支持对应的请求方法时,应当返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
URL和URI的区别
可以参考:https://www.zhihu.com/question/21950864
URI:Universal Resource Identifier统一资源标识符(URI = URL + URN)
1.笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不一定指定如何定位资源。比如 mailto、news 和 isbn URI 都是 URN 的示例;
2.此外URI可以是相对路径,也可以是绝对路径;
3.在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析;
4.Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
URL:Uniform Resource Location统一资源定位符
URL 是一个结构化字符串,它支持解析的语法运算以及查找主机和打开到指定资源的连接之类的网络 I/O 操作。
1.URL其实是URI的一个子类,URL更为具体化,不仅包括了指定的标识符,还需要指定访问资源的位置
2.URL必须是绝对路径;
3.URL类可以打开一个到达资源的流,因此URL类只能作用于那些 Java类库知道该如何处理的模式;
4.URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
URL一般由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。
拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。
现实当中名字当然是会重复的,所以身份证号才是URI,通过身份证号能让我们能且仅能确定一个人。
那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比,就可以有:
动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人
可以看到,这个字符串同样标识出了唯一的一个人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置来唯一确定一个人的。
在上文我们用身份证号也可以唯一确定一个人。对于这个在杭州的张三,我们也可以用:身份证号:123456789来标识他。
header附件: