前言
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
今天我们来详细了解下它的一些特点及Java里对此协议的解析处理。
正文
我们发送一个HTTP 请求,在浏览器中可以看到HTTP协议的一些信息。
Request Headers:
POST /test HTTP/1.1
POST 表示HTTP的请求方法类型。
/test 表示请求URI。
HTTP/1.1 表示协议和协议版本。
说明:HTTP协议里目前定义了8种请求方法类型。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送“*”的请求来测试服务器的功能性。
HEAD:服务器返回与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
GET:向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。
POST:向指定资源提交数据进行处理请求,数据被包含在请求体中,POST请求可能会导致新的资源的建立或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除指定的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
Host: localhost:8080 表示服务器域名地址
Connection: keep-alive 表示连接类型,一直保持连接。
Content-Length: 11 表示参数长度
Accept: application/json, text/javascript, */*; q=0.01 表示接受的数据类型,逗号分隔,优先支持程度从前到后,q表示权重, 0<=q<=1, 权重越大,分号前面这一项支持度越好,0表示不支持,不指定q值默认为1。
Origin: http://localhost:8080 表示源数据地址。
X-Requested-With: XMLHttpRequest XMLHttpRequest对象,可以实现局部更新,ajax使用。
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 表示用户代理信息,浏览器信息等。
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 提交数据类型,编码格式。
Referer: http://localhost:8080/ 表示引用源地址
Accept-Encoding: gzip, deflate, br 表示浏览器支持的压缩编码格式。当前浏览器支持 gzip, deflate, br 三种压缩算法。
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 可以接受的语言。
Cookie: Idea-6ad4ef07=ced8796b-12ab-4db6-9bd7-556be6c5132b; JSESSIONID=3F1698BD54B15FFE91EC948154761956 Cookie信息。
Status Code: 200 状态码。
目前总共有41种状态码。
在HttpServletResponse有定义,有兴趣的可以看看。
主要状态码及含义如下:
状态码 | 含义 |
---|---|
100 | 表示客户端可以继续 |
101 | 表示服务器正在根据升级头切换协议 |
200 | 表示请求成功 |
201 | 表示请求成功,并在服务器上创建了一个新资源 |
202 | 表示服务器接受了处理请求,但未完成 |
203 | 表示客户端提供的元信息并非来自服务器 |
204 | 表示请求成功,但没有返回新信息 |
205 | 表示代理可能被重置导致发送了文档视图 |
206 | 表示服务器已经完成了对资源的部分GET请求 |
300 | 表示所请求的资源对应一组资源,组里每一种表示都有其特定的位置 |
301 | 表示资源已经永久地移动到一个新的位置,并且将来的请求应使用一个新的URI |
302 | 表示资源暂时移动到其它的URI下 |
303 | 表示可以在其它的URI下找到对请求的响应 |
304 | 表示GET操作发现资源可用且未修改 |
305 | 表示资源必须通过代理访问 |
307 | 表示资源暂时在其它的URI下,但是这个URI地址应该在响应的时候给出 |
400 | 表示客户端发送的请求语法错误 |
401 | 表示请求需要HTTP身份验证 |
402 | 保留以备将来使用 |
403 | 表示服务器接受了请求,但拒绝执行 |
404 | 表示请求的资源不可用或者找不到 |
405 | 表示对于要请求的资源,请求中指定的方法是不允许的 |
406 | 表示请求标识的资源仅能够根据请求中发送的accept标头生成具有不可接受的内容特征的响应实体 |
407 | 表示客户端必须先通过代理进行身份验证 |
408 | 表示客户端在服务器准备等待的时间内没有生成请求 |
409 | 表示由于与资源的当前状态发生冲突,请求无法完成 |
410 | 表示该资源在服务器上不再可用,且不知道转发地址 |
411 | 表示如果没有定义Content-Length,则无法处理请求 |
412 | 表示在服务器上测试时,在一个或多个请求头字段中给出的前提条件评估不通过 |
413 | 表示服务器拒绝处理请求,因为请求实体大于服务器能够处理的大小 |
414 | 表示服务器拒绝服务请求,因为request-uri长度超过了服务器能够处理的长度 |
415 | 表示服务器拒绝服务请求,因为请求的实体的格式不受请求方法的请求资源支持 |
416 | 表示服务器不能为请求的字节范围提供服务 |
417 | 表示服务器不能满足Expect请求头中给出的期望 |
500 | 表示服务器内部的一个错误,它阻止了服务器完成请求 |
501 | 表示服务器不支持满足请求所需的功能 |
502 | 表示服务器作为代理或网关服务器时接收到了无效响应 |
503 | 表示服务器暂时过载,无法处理请求 |
504 | 表示服务器作为网关或代理服务器时没有及时收到来自上游服务器的响应 |
505 | 表示服务器不支持或拒绝支持请求消息中使用的HTTP协议版本 |
我们来看一下后端Java部分的一些处理吧。
找到HttpServlet,可以看到它定义的几种请求方法。
同时GET,POST,PUT,DELETE都需要被实现。HEAD、OPTIONS、TRACE已被实现。
我们根据上面的知识,可以自己实现一个HttpServlet,同时可以实现其它的自定义方法,比如有的面试会问如何在请求里新增压缩图片方法(或者其它方法),我们的大致实现过程如下:
我们需要新增自定义协议COMPRESS。
我们新建HttpTestServlet 抽象类,新增方法 doCompress。
这样我们写一个测试Servlet,实现doCompress方法。
发送ajax,type 为 COMPRESS。
如下:可以看到请求方法变成了COMPRESS。
总结
通过对HTTP协议的理解,加深了对HTTP协议的认识与认知。