HTTP协议简介-超文本传输协议javascript
HTTP协议是请求/响应协议:客户端发送请求到服务器,服务器响应该请求。当前版本为1.1版本。html
HTTP协议特色java
1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法经常使用的有GET POST 。程序员
2. 灵活:HTTP容许传输任意类型的数据对象。传输的类型由content-type加以标记。web
3.无链接:无链接的含义就是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应道后,即断开连接。ajax
4.无状态:HTTP协议是无状态协议。无状态是指协议对与事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则他必须重传,这样可能致使每次连接传送的数据量增大。编程
HTTP消息json
HTTP消息由从客户端到服务器的请求消息和服务器到客户端的响应消息组成。后端
HTTP请求消息实例api
实例:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
HTTP请求方法
http经常使用请求-get请求方法
get请求通常用于获取/查询资源信息,格式为:
GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive
HTTP经常使用请求--post请求方法
post请求通常用于提交表单,格式为:
POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive (----此处空一行----) name=Professional%20Ajax&publisher=Wiley
URL
URL = http://主机名:端口/l路径?查询
若是没有指定端口,那么默认使用80端口
例子:
http://www.baidu.com/
https://www.baidu.com/baidu?wd=w3school
常见的请求头
请求头,用来讲明服务器要使用的附加信息,比较重要的信息有 Cookie、Referer、User-Agent 等,下面将一些经常使用的头信息说明以下:
Accept,请求报头域,用于指定客户端可接受哪些类型的信息。
Accept-Language,指定客户端可接受的语言类型。
Accept-Encoding,指定客户端可接受的内容编码。
Host,用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,Request 必须包含此内容。
Cookie,也经常使用复数形式 Cookies,是网站为了辨别用户进行 Session 跟踪而储存在用户本地的数据。Cookies 的主要功能就是维持当前访问会话,例如咱们输入用户名密码登陆了某个网站,登陆成功以后服务器会用 Session 保存咱们的登陆状态信息,后面咱们每次刷新或请求该站点的其余页面时会发现都是保持着登陆状态的,在这里就是 Cookies 的功劳,Cookies 里有信息标识了咱们所对应的服务器的 Session 会话,每次浏览器在请求该站点的页面时都会在请求头中加上 Cookies 并将其发送给服务器,服务器经过 Cookies 识别出是咱们本身,而且查出当前状态是登陆的状态,因此返回的结果就是登陆以后才能看到的网页内容。
Referer,此内容用来标识这个请求是从哪一个页面发过来的,服务器能够拿到这一信息并作相应的处理,如作来源统计、作防盗链处理等。
User-Agent,简称 UA,它是一个特殊字符串头,使得服务器可以识别客户使用的操做系统及版本、浏览器及版本等信息。在作爬虫时加上此信息能够假装为浏览器,若是不加极可能会被识别出为爬虫。
Content-Type,即 Internet Media Type,互联网媒体类型,也叫作 MIME 类型,在 HTTP 协议消息头中,使用它来表示具体请求中的媒体类型信息。例如 text/html 表明 HTML 格式,image/gif 表明 GIF 图片,application/json 表明 Json 类型,更多对应关系能够查看此对照表:http://tool.oschina.net/commons。
请求体
即请求体,通常承载的内容是 POST 请求中的 Form Data,即表单数据,而对于 GET 请求 Request Body 则为空。
例如在这里我登陆 GitHub 时捕获到的 Request 和 Response 如图
在登陆以前咱们填写了用户名和密码信息,提交时就这些内容就会以 Form Data 的形式提交给服务器,此时注意 Request Headers 中指定了 Content-Type 为 application/x-www-form-urlencoded,只有设置 Content-Type 为 application/x-www-form-urlencoded 才会以 Form Data 形式提交,另外咱们也能够将 Content-Type 设置为 application/json 来提交 Json 数据,或者设置为 multipart/form-data 来上传文件。
下面列出了 Content-Type 和 POST 提交数据方式的关系:
HTTP响应
客户端向服务器发送一个请求,服务器返回响应,HTTP协议也有四部分组成。分别是:状态行,消息报头(响应头),空行和响应正文。
根据响应的类别,服务器响应里能够含有响应正文,但并无全部的响应都有响应正文。
HTTP响应实例
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
常见的HTTP响应头
响应头,其中包含了服务器对请求的应答信息,如 Content-Type、Server、Set-Cookie 等,下面将一些经常使用的头信息说明以下:
Date,标识 Response 产生的时间。
Last-Modified,指定资源的最后修改时间。
Content-Encoding,指定 Response 内容的编码。
Server,包含了服务器的信息,名称,版本号等。
Content-Type,文档类型,指定了返回的数据类型是什么,如text/html 则表明返回 HTML 文档,application/x-javascript 则表明返回 JavaScript 文件,image/jpeg 则表明返回了图片。
Set-Cookie,设置Cookie,Response Headers 中的 Set-Cookie即告诉浏览器须要将此内容放在 Cookies 中,下次请求携带 Cookies 请求。
Expires,指定 Response 的过时时间,使用它能够控制代理服务器或浏览器将内容更新到缓存中,若是再次访问时,直接从缓存中加载,下降服务器负载,缩短加载时间。
HTTP响应状态码
Response 消息中的第一行叫作状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求没法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
HTTP响应状态码-典型
GET请求与post请求区别
get请求方法:
请求资源
请求数据在URL中,只能提交字符串类型的数据,长度有限制,少于255字符。
get方法速度快
安全性低,数据置于请求行,客户端地址可见。
post请求方法:
提交数据
请求数据在请求主体中传递
安全性高,数据置于消息主题内,客户端不可见。
请求数据类型不受限制,长度不受限制。
速度慢
http协议是无状态的
http协议是无状态的,同一个客户端的此次请求和上次请求是没有对应关系,对http服务器来讲,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态。
fiddler抓包工具简介
fiddler是经过改写HTTP代理,让全部客户端和服务器的http和https请求从fiddle那经过,容许你监视,设置断点,甚至修改输入输出数据。
在打开fiddle他的那一瞬间,他就已经设置好了浏览器的代理了。当你关闭的时候它又帮你把代理还原了,一切不须要手动设置。
fiddler抓包原理
fiddler抓包工具
火狐浏览器须要本身设置代理,谷歌浏览器自动设置代理
请求过滤
https安装证书
移动端APP抓包
接口是个比较泛义上的概念,主要表示系统对外交互的部分,好比电源插座是电器和电能之间的接口,图形界面是应用软件和用户的接口,医院挂号大厅是医生和病人之间的接口
咱们要学习的接口概念缩小到web系统提供的对外消息交互接口,经过发送对应的请求给服务器,服务器会返回相应的结果,由于其调用模式很是像编程语言中的API,因此web消息交互接口又叫webapi。
目前web服务接口都是基于http协议传递消息
一般你们所说的,web服务接口,websevice ,webapi其实表示的都是一个意思
主流的http消息体类型主要分为两种
SOAP UI: 使用XML格式传输消息体,因为阅读性差,同等信息量传输耗费的资源多,由于标签
REST: 定义了一种消息传输的风格,规定了消息体和URL的请求格式,同时也规定服务端的开发设计架构。本质上仍是用http协议传输消息,至于这种风格具体是什么,怎么就肯定我开发的系统符合REST定义的风格规范,不少作了不少年服务端开发的人员也不必定能说清楚,因为没有强制的要求,即便开发的服务没有彻底符合REST风格规范,也可使用
因此咱们也不须要了解到底REST风格是什么样子的,可能大家有疑惑,这个也不了解那么咱们怎么测试webapi呢
其实咱们只要知道,无论系统处于那种设计风格,只要是基于HTTP协议,咱们就能对他进行测试
只要是发送数据交互过程有来有往,咱们就能够用通用的方法来测试这个系统
一般系统内部的接口是不须要QA测试的,若是测试须要提供API文档,由于这是一个判断api是否符合需求的标准。
即便要测试内部接口,多数也不是从功能的角度来测试,而是以安全的角度。
对外暴露的接口必需要对其进行测试,若是提供API文档,那么测试人员须要本身准备文档,而后提交给开发进行评审。
新学习web的人常常混淆的两个名词就是HTTP和HTML,
都是姓H的,都是互联网领域的名词。很容易混淆。
HTML是一种用来定义网页的文本语言,
会HTML,就能够编写网页;
咱们访问百度获得的内容是html,你们能够打开浏览器查看源码看到HTML
HTTP是在网络上传输信息(固然也包括HTML)的协议,一般用于浏览器和服务器的通讯。
二者的关系作个类比,一个比如快递的商品(HTML),一个比如运输商品的方式(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
请求获取Request-URI所标识的资源
就是向uri指定的资源发出“获取”请求。使用GET方法通常用在读取数据,
这应该是一种最多见的请求了。
表示在Request-URI所标识的资源后附加新的数据
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。
数据被包含在请求消息中。这个请求可能会建立新的资源或修改现有资源。
向指定资源位置上传其最新内容。一般用于更新修改部分资源信息。
请求服务器删除Request-URI所标识的资源。
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响应消息包含以下内容
l 状态行
l 响应头
l 空行
l 消息体
状态行和响应头是必须有的。
空行和消息体可能有也可能没有。
状态行在第一行,包含协议版本状态码和描述状态的短语
好比
HTTP/1.1 200OK
咱们重点来看一下状态码,它表示客户端的的请求结果如何
(这类不常见,先忽略过去)
(最常见的就是200,抓包给你们看看)
(在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发生了变化,用原来的地址访问就会出现这种状况
表示服务器没法完成明显有效的请求。这类状态码表明了服务器在处理请求的过程当中有错误或者异常状态发生,也有多是服务器意识到以当前的软硬件资源没法完成对请求的处理。
500 Internal Server Error服务端的代码错误致使,一般是一个异常抛出了
503 Service Unavailable
因为临时的服务器维护或者过载(好比被攻击致使服务端的防护措施),服务器当前没法处理请求。这个情况是暂时的,而且将在一段时间之后恢复。
http的响应头用来表示响应的其它信息。
格式和请求头相似,有不少能够共用的字段。
Content-Type:text/html;charset=utf-8
消息体的数据格式,这个是常用的,
Content-Length表示请求消息体的长度
Date:Sun, 30 Jul 2017 08:25:37 GMT表示响应消息发送的日期时间
其余经常使用的响应头感兴趣的能够参考网上的信息,后面的课程会一一说到
不少时候,http响应是须要消息体的。好比请求一个网页的内容,那么咱们网页的html内容就在响应的消息体中给出。
百度搜索 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路径过滤