图解 HTTP
[TOC]
前言
返回结果的 HTTP 状态码
HTTP 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
状态码,以 3 位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。响应类别有以下 5 种。
在 RFC2616 上的 HTTP 状态码就达 40 种,若再加上 WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)(RFC4918、5842) 和附加 HTTP 状态码(RFC6585)等扩展,数量就达 60 余种,实际上经常使用的大概只有 14 种。
- 200 OK:表示从客户端发来的请求在服务器端被正常处理了。
- 204 No Content:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。
- 206 Partial Content:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
- 301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。这时应该按 Location 首部字段提示的 URI 重新保存。
- 302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
- 303 See Other:该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。与 302 不同的是,303 状态码明确表示客户端应当采用 GET 方法获取资源。
- 304 Not Modified:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。
- 307 Temporary Redirect:临时重定向。与 302 基本相同,307 会遵照浏览器标准,不会从 POST 变成 GET。
- 400 Bad Request:该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
- 401 Unauthorized:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
- 403 Forbidden:状态码表明对请求资源的访问被服务器拒绝了。
- 404 Not Found:该状态码表明服务器上无法找到请求的资源。
- 500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误。
- 503 Service Unavailable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
与 HTTP 协作的 Web 服务器
HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。它们可以配合服务器工作。
- 代理:代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
- 网关:网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
- 隧道:隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加 Via 首部字段以标记出经过的主机信息。
代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。
- 缓存代理:代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
- 透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
HTTP 首部
字段名 | 说明 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/html |
Accept-Charset | 客户端可以接受的字符编码集 | Accept-Charset: utf-8 |
Accept-Encoding | 能够接受的内容编码方式 | Accept-Encoding:gzip, deflate |
Accept-Language | 可以接受的自然语言列表 | Accept-Language:zh-CN,zh;q=0.9,en;q=0.8 |
Accept-Datetime | 指定接受的版本时间 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT |
Authorization | 用于身份认证的凭证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求缓存机制 | Cache-Control: no-cache |
Connection | 连接类型(默认持久连接) | Connection: keep-alive |
Cookie | 向服务器发送的Cookie信息 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求信息长度 | Content-Length: 348 |
Content-Type | 当前请求MIME类型 | Content-Type:application/json; charset=utf-8 |
Date | 发送时间 | Date:Thu, 23 Nov 2017 14:41:17 GMT |
Expect | 指明需要的特定服务器行为 | Expect: 100-continue |
Host | 指明请求服务器的域名和端口号 | Host:www.baidu.com:80 |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Modified-Since | 设置更新时间 | If-Modified-Since: Sat,29 Oct 1994 19:43:31 GMT |
If-None-Match | 设置客户端ETag值 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Range | 适用于断点续传下载 | If-Range: "737060cd8c284d8af7ad3082f209582d" |
If-Unmodified-Since | 请求体在给定时间未修改才响应 | If-Unmodified-Since: Sat,29 Oct 1994 19:43:31 GMT |
Max-Forwards | 限制代理或网关转发消息的次数 | Max-Forwards: 10 |
Origin | 跨域资源请求的地址 | Origin: http://www.baidu.com |
Pragma | 设置特殊实现的指令 | Pragma: no-cache |
Proxy-Authorization | 向连接代理认证的凭证信息 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 指定请求返回的字节数范围 | Range: bytes=500-999 |
Referer | 表明当前请求从哪个页面过来的 | Referer: http://www.baidu.com |
TE | 指明期望使用的传输编码 | TE: trailers, deflate |
User-Agent | 请求用户的身份信息 | Mozilla/5.0 (Mac OS X 10_13_1) Chrome/62.0.3202.94 Safari/537.36 |
Upgrade | 请求服务端升级协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | 表明请求代理的来源地址 | Via: 1.0 fred, 1.1 example.com(Apache/1.1) |
Warning | 消息实体中可能存在错误的警告 | Warning: 199 Miscellaneous warning |
网友评论