参考《Netty权威指南2》
申明:此篇博客仅仅是为了自己学习和记忆使用,如有侵权,请联系删除
1.1 HTTP协议定义&介绍
HTTP协议(超文本传输协议)是建立在TCP传输协议的上的应用层协议。
HTTP协议具有以下特点:
- 支持Client/Server 模式
- 简单--客户向服务器请求服务时,只需指定服务的URL,携带必要的请求参数或者消息体
- 灵活--HTTP允许传输任意类型的数据对象,传输的内容类型由HTTP消息头中的Content-Type加以标记
- 无状态---HTTP协议是无状态协议,无状态是指:协议对于事务处理没有记忆能力。缺少状态意味着后续处理需要之前的信息,则它必须重传,这样可能导致每次连接传输的数据量增大。另一方面,如果服务器不需要之前的信息时,他的应答比较快,负载较轻
1.2 HTTP协议的URL
HTTP URL (URL 是一种特殊类型的URI,包含了查找某个资源的足够信息)的格式如下:
http:// host[":"port] [abs_path] |
说明:
- http 是具体的协议类型,http表示需要使用Http协议来定位网络资源
- host 表示合法的主机的IP地址或者域名
- port 表示主机的端口,为空的话,默认是使用80端口
- abs_path 指定请求资源给的URI,如果没有abs_path ,那么它作为URI时,必须以"/"结尾,这点浏览器会帮助我们自动完成
1.3 HTTP请求消息
HTTP 请求包含以下三部分:
- HTTP 请求行
请求行以一个方法付开头,以空格分开,后面跟着请求的URI和协议版本,格式为:
Method Request-URI HTTP-Version CRLF
例子:如GET 请求 http://www.test.com/login
请求行: GET /login HTTP/1.1
其中Method包含以下类型:
-
GET:请求获取Request-URI所3标识的资源
-
POST:在Request-URI所标识的资源后附加新的提交数据
-
HEAD:请求获取Request-URI 所标识的资源的响应消息报头
-
PUT:请求服务器存储一个资源,并用Request-URI作为其标识
-
DELETE:请求服务器删除Request-URI标识的资源
-
TRACE: 请求服务器回送收到的请求消息,主要用于诊断或者测试
-
CONNECT:保留将来使用
-
OPTIONS:请求查询服务器性能,或者查询与资源相关的选项和需求
GET和POST区别:
- POST方法要求被请求服务器接受附在请求后面的数据,常用于表单的提交
- GET一般用于获取/查询 资源信息,而POST一般用于更新数据信息
- 根据HTTP规范,GET用于信息的获取,而且应该是安全和幂等的,而POST则表示可能改变服务器上的资源请求。
- GET提交,请求参数会附在URL之后,就是把参数放置在参数行中,以“?”分隔URL和传输数据,多个参数以“&”连接;而POST提交会把提交的参数放置在HTTP的包体之中,数据不会在地址栏中显示出来。
- 传输的数据大小不同。特定的浏览器和对应的服务器对URL的长度有限制,例如:IE对URL的长度限制是2083字节(2KB+35B),因此携带的参数长度会受到浏览器的限制;而POST不通过URL传递参数,理论上数据长度不会受限制。
- 安全性。POST安全性要比GET更高。比如通过GET提交数据,用户将用户名和密码都出现在URL上,1)登录页面被浏览器缓存了;2)其他人查看浏览器历史记录,那么别人可能拿到你的账号和密码了。除此之外,GET提交数据可能还会造成Cross-site request forgery(跨站请求伪造)攻击,而POST不存在上述安全问题。
- HTTP 请求头
部分请求头消息如下:
名称 | 作用 |
Accept | 用于指定客户端接受哪些类型的信息 例如:Accept : image/gif 表明客户端希望接收gif的图片资源 |
Accept-Charset | 用于指定客户端接受的字符集。 例如:Accept-CHarset:ios-8895-1,gb2312,如果在请求消息中,没有设置这个域,默认是任何字符集都可以接受 |
Accept-Encoding | 类似于Accept,但是它用于指定可接受的内容编码 例如:Accept-Encoding:gzip.deflate,如果在请求消息中没有设置这个域,则服务器假定客户端可以接受各种内容编码 |
Accept-Language | 类似于Accept,但是它用于指定一种自然语言 例如:Accept-Language:zh-cn 如果消息中没有设置这个报头域,则服务器假定客户端对各种自然语言都可以接受 |
Authorization | 主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果接受到服务器的响应代码为401(未授权),可以发送一个包含Authorization的请求报头域的请求,要求服务器对其进行认证 |
Host | 发送请求时,该报头域时必须的,用于指定被请求资源的Internet主机和端口号,它通常是从HTTP url中取出来的 |
User-Agent | 允许客户端将他的操作系统、浏览器和其他属性告诉服务器 |
Content-Length | 请求消息的长度 |
Content-Type | 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显示地指定为text/html。 由于经常设置Content-Type,因此HttpServletReponse提供了一个方法setContentType |
Connection | 连接类型,通常是keep-alive |
- HTTP 请求正文(请求体)
HTTP响应消息
响应消息分为3部分
- 状态行
状态行格式为: HTTP-Version Status-Code Reason-Parase CRLF
HTTP-Version:表示服务器HTTP协议的版本
Status-Code: 表示服务返回的响应状态码,状态码有三位数字组成,第一个数字表示响应消息的类别,有五种可能取值。
- 1xx:指示信息。表示请求已经接收,继续处理
- 2xx: 成功。 表示该请求已经被成功接收,理解,接受
- 3xx: 重定向。要完成请求必须进一步操作
- 4xx: 客户端错误。请求又语法错误 或者请求无法实现
- 5xx:服务器错误。服务器端未能处理请求
常见的状态码及含义
状态码 | 含义 |
200 | OK: 客户端请求成功 |
304 | 未修改,上次返回的数据没做任何修改,服务器也不会返回数据 |
400 | Bad Request: 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized: 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden:服务器接收到请求,但拒绝服务 |
404 | Not Fund: 请求资源不存在 |
500 | Internal Server Error: 服务器发生不可预期错误 |
503 | Server Unavilable: 服务器当前不能处理客户端请求,一段时间后可能恢复正常 |
504 | (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请 |
- 消息报头
常用的响应报头
名称 | 作用 |
Location | 用于重定向接收者到一个新位置,Location响应报头域常用于更换域名的时候 |
Server | 包含了服务器用来处理请求的软件信息,与User-Agent请求报头域是相对应的 |
WWW-Authenticate | 必须包含在401(未授权的)响应消息中,客户端收到401消息,并发送Authorization报头域请求服务器对其进行验证,服务端响应报头就包含该报头域 |
- 响应正文