需要知道的HTTP 知识
一、TCP/IP网络模型
TCP/IP模型借鉴于OSI七层网络模型,将会话层、表示层、应用层合并到应用层
各层之间传输数据时,会按照各自的协议进行封包和解包。发送端传输时打上该层所属的首部信息,接收端每经过一层则将对应首部信息去除
二、HTTP 报文结构
(一)请求报文
请求行
请求方法 /请求文件URI路径 /HTTP版本
GET /home HTTP/1.1
(二)响应报文
状态行
HTTP版本 /状态码 /原因短语
HTTP/1.1 200 OK
三、HTTP 的请求方法
http/1.1规定以下请求方法
- GET: 通常用于获取资源
- POST: 提交数据,即上传数据
- HEAD: 获取资源的元信息
- 与GET方法相同,但不返回报文主体
- 用于确认 URI 的有效性及资源更新的日期时间等
- PUT: 用来传输文件,但HTTP/1.1不带验证机制
- 请求报文的主体中包含文件内容
- 将文件保存到请求URI中
- DELETE:删除资源,但HTTP/1.1不带验证机制
- OPTIONS:查询资源支持的请求方法
- CONNECT: 建立连接隧道,用于代理服务器
- TRACE: 追踪请求-响应的传输路径
GET 和 POST 有什么区别
- 从语义的角度
- GET请求资源,POST提交数据
- 从参数的角度
- GET参数通过URL传递,POST放在Request body中更适合传递敏感信息
- GET请求在URL中传送的参数是有长度限制的(2k),而POST没有
- 从编码的角度
- GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制
- 从幂等性的角度
- GET是幂等的,而POST不是 (表示执行相同的操作,结果也是相同的)
- 从浏览器行为的角度
- GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会
- GET产生的URL地址可以被Bookmark,而POST不可以
- GET在浏览器回退时是无害的,而POST会再次提交请求
- 从TCP的角度
- GET产生一个TCP数据包,POST产生两个TCP数据包
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据
- 对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok 返回数据
- 火狐浏览器除外,POST 请求只发一个 TCP 包
- GET产生一个TCP数据包,POST产生两个TCP数据包
四、理解URI
URI全称为(Uniform Resource Identifier), 也就是统一资源标识符。用于区分互联网上的资源
(一)URI 的结构
- http 和 https 的默认端口分别为80、443
(二)URI 编码
- URI 只能使用
ASCII
, ASCII 之外的字符是不支持显示的 - URI 引入了
编码
机制,将所有非 ASCII 码字符和界定符转为十六进制字节值,然后在前面加个%
五、理解 HTTP 状态码
(一) 1XX Informational (信息性状态码)
表示临时响应并需要请求者继续执行操作
100 Continue 继续
请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分
101 Switching Protocols 切换协议
请求者已要求服务器切换协议,服务器已确认并准备切换
(二) 2XX Success(成功状态码)
表示成功处理了请求的状态码
200 OK 成功
服务器已经成功处理请求。通常表示服务器提供了请求的网页
201 Created 已创建
请求成功并且服务器创建了新的资源
202 Accepted 已接受
服务器已接受请求,但尚未处理
203 Non-Authoritative Information 未授权信息
服务器已经成功处理了请求,但返回的信息可能来自另一来源
204 No Content 无内容
请求成功处理,客户端请求的资源存在,但其表示是空的
若服务器拒绝对PUT、POST或者DELETE请求返回任何状态信息或表示,通常采用此响应代码
205 Reset Content 重置内容
与204类似,表明客户端应重置数据源的视图或数据结构
206 Partial Content 部分内容
表示客户端进行范围请求,服务端成功执行
用于对部分GET请求(即使用Range请求报头的GET请求)的响应,常用于大型二进制文件的断点续传
(三) 3XX Redirection(重定向状态码)
表示要完成请求,需要进一步操作。通常用来重定向
300 Multiple Choices 多重选择
被请求的资源在服务器端存在多个表示,而服务器不知道客户端想要的是哪一个表示时,发送这个响应代码
301 Moved Permanently 永久移动
请求的网页已永久移动到新位置。对GET或HEAD请求的响应服务器返回此响应时,会自动将请求者转到新位置
302 Found 临时移动
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
比如你的网站从 HTTP 升级到了 HTTPS 了,以前的站点再也不用了,应当返回301,这个时候浏览器默认会做缓存优化,在第二次访问的时候自动访问重定向的那个地址
而如果只是暂时不可用,那么直接返回302即可,和301不同的是,浏览器并不会做缓存优化
303 See Other 查看其它位置
请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码
请求已经被处理,但服务器不是直接返回一个响应文档,而是返回一个响应文档的URI
304 Not Modified 未修改
自动上次请求后,请求的网页未修改过。服务器返回此响应,不会返回网页的内容
305 Use Proxy 使用代理
请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
307 Temporary Redirect 临时性重定向
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有的位置来进行以后的请求
(四) 4XX Client Error(客户端错误状态码)
表示请求可能出错,妨碍了服务器的处理
400 Bad Request 错误请求
服务器不理解请求的语法
401 Unauthorized 未授权
请求要求身份验证。对于需要登录的网页,服务器可能返回此响应
403 Forbidden 禁止
客户端请求的结构正确,但服务器拒绝请求
404 Not Found 未找到
服务器找不到请求的网页
405 Method Not Allowd 方法禁用
禁用请求中指定的方法
406 Not Acceptable 不接受
当客户端对表示有太多要求,以至于服务器无法提供满足要求的表示
407 Proxy Authentication Required 需要代理授权
此状态码与401(未授权)类似,但指定请求者应当授权使用代理
408 Reqeust Timeout 请求超时
服务器等候请求时发生超时
409 Conflict 冲突
请求的操作会导致服务器的资源处于一种不可能或不一致的状态
服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息
410 已删除
如果请求的资源已永久删除,服务器就会返回此响应
411 需要有效长度
服务器不接受不含有效内容长度标头字段的请求
412 未满足前提条件
服务器未满足请求者在请求者设置的其中一个前提条件
413 Request Entity Too Large 请求实体过大
服务器无法处理请求,因为请求实体过大,超出了服务器的处理能力
414 Request-URI Too Long: 请求的URI过长
请求的URI(通常为网址)过长,服务器无法处理
415 不支持媒体类型
请求的格式不受请求页面的支持
416 请求范围不符合要求
如果页面无法提供请求的范围,则服务器会返回此状态码
417 未满足期望值
服务器未满足“期望”请求标头字段的要求
(五) 5XX Server Error(服务器错误状态码)
表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错
500 Internal Server Error 服务器内部错误
服务器遇到错误,无法完成请求
501 Not Implemented 尚未实施
服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
502 Bad Gateway 错误网关
服务器作为网关或代理,从上游服务器无法收到无效响应
503 Service Unavailable 服务器不可用
服务器目前无法使用(由于超载或者停机维护)。通常,这只是暂时状态
504 网关超时
服务器作为网关代理,但是没有及时从上游服务器收到请求
505 HTTP版本不受支持
服务器不支持请求中所用的HTTP协议版本