重识 HTTP
HTTP 是网络应用层协议,它处在5层网络结构中的第一层(如下图),是万维网一切数据通信的基础。但最初,它只是用来提供一种服务器端发布和浏览器端接收 HTML 页面的方法。

HTTP 请求报文结构
一个 http 请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求正文(request-body)4个部分组成。

请求行:由 请求方法
、URL
和 http协议版本
3个字段组成。
请求头:请求头部由键值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:User-Agent(请求的浏览器类型)、Accept(客户端可识别的内容类型列表)、Host(请求的主机名,允许多个域名同处一个IP地址,即虚拟主机)。
空行:最后一个请求头之后是一个空行,发送回车符 和换行符,通知服务器以下不再有请求头。
请求正文:请求参数,它不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP 响应报文结构
HTTP响应也由3个部分组成,分别是:状态行(status line)、消息报头(headers)、响应正文(response body)。
http 响应报文 与 请求报文 的对比:

状态行:服务器HTTP协议的版本 + 响应状态码 + 状态码的文本描述,如HTTP/1.1 200 OK
。
消息报头:用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。如:服务器支持哪些请求方法、文档编码方法(Content-Encoding)、内容长度(Content-Length)、内容文档类型(Content- Type)、当前时间、缓存信息等。
响应正文:可能是一个html页面或片段,也可能只是一段纯数据或js代码。
8种http请求方法
- GET:向指定的资源发出“显示”请求,应只用在读取数据,而不应当被用于产生“副作用”的操作中。
- HEAD:同GET方法,都是向服务器发出指定资源的请求。它可以在不必传输全部内容的情况下,获取其中“关于该资源的信息”。
- POST:向指定资源提交数据,请求服务器进行处理(例:提交表单、上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除Request-URI所标识的资源。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
- OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。
当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405,当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
响应报文状态码
状态码 | 含义 | 例子 |
---|---|---|
1xx | 指示信息–表示请求已接收,继续处理 | |
2xx | 成功–表示请求已被成功接收、理解、接受 | HTTP/1.1 200 OK |
3xx | 重定向–要完成请求必须进行更进一步的操作 | |
4xx | 客户端错误–请求有语法错误或请求无法实现,如请求链接为不存在 | HTTP/1.1 404 Not Found |
5xx | 服务器端错误–处理某个正确请求时发生错误 |
常见状态代码含义如下:
- 200 OK:客户端请求成功。
- 204 No Content:服务器成功处理了请求,但没有返回任何内容。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
http/2 与 http/1.1 的区别
- 对HTTP头字段进行数据压缩(即HPACK算法);
- HTTP/2 支持 服务端推送 (Server Push);
- 请求 管线化;
- 修复HTTP/1.0版本以来未修复的 队头阻塞 问题;
- 对数据传输采用多路复用,让多个请求合并在同一 TCP 连接内。
HTTP/2 高度兼容 HTTP/1.1 的用法。它的请求方法、状态码乃至url和绝大多数http头部字段一致,并支持新特性来让你获得更快的速度。
GET 和 POST 的区别
- GET请求的数据附在URL之后,POST提交的数据是放置在HTTP包着的<request-body>中。
- 传输数据的大小不同。GET长度最大是2048个字符,POST无限制。
- 安全性不同。GET提交的参数将明文出现在URL上,存在安全隐患。
- GET能缓存,POST不能缓存。
- 后退页面的动作不同。GET无害,POST会再次重新提交页面请求。
使用http好久了,但是之前却没有好好花时间系统整理下这块的知识点。虽然说的可能都是别人说过的,但是他山之石可攻玉。就当是作为自己学习http协议的一个总结和回顾吧!
推荐参考和学习的资料: