Web 开发指南(三)HTTP 协议常用知识
本文简要介绍一下 HTTP 协议的请求和响应过程中常用的知识点,如常用的请求方法、常见的响应状态码、常见的请求头信息等。
HTTP 请求
根据前文《 HTTP 协议入门》我们可知,一个 HTTP 的请求组成部分为:请求行 + 请求头 + 一个空行(\r\n) + 请求数据,其中请求行组成:请求方法 + 统一资源定位符 + HTTP 协议版本。
常用请求方法
| 方法 | 说明 | 
|---|---|
| GET | GET 请求会显示请求指定的资源,一般来说 GET 方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。它期望的应该是而且应该是安全的和幂等的,这里的安全指的是,请求不会影响到资源的状态。 | 
| POST | POST 请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST 方法是非幂等的方法,因为这个请求可能会创建新的资源或/和修改现有资源。 | 
| PUT | PUT 请求会身向指定资源位置上传其最新内容,PUT 方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。 | 
| DELETE | DELETE 请求用于请求服务器删除所请求 URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE 请求后指定资源会被删除,DELETE 方法也是幂等的。 | 
| HEAD | HEAD 方法与 GET 方法一样,都是向服务器发出指定资源的请求。但是服务器在响应 HEAD 请求时不会回传资源的内容部分,即:响应主体。这样我们可以不传输全部内容的情况下就可以获取服务器的响应头信息,HEAD 方法常被用于客户端查看服务器的性能(响应时间)。 | 
| OPTIONS | OPTIONS 请求与 HEAD 类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有 HTTP 请求方法,该方法会用’*‘来代替资源名称,向服务器发送 OPTIONS 请求,可以测试服务器功能是否正常。JavaScript 的 XMLHttpRequest 对象进行 CORS 跨域资源共享时,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限。 | 
统一资源定位符(URL)
想知道资源定位符是什么?先了解一下 URI(Uniform Resource Identifier):URI 是统一资源标识符,可以唯一标识一个资源,URI 的实现有 URL、URN、URC 等方式,也就是说 URL、URN 是 URI 的子集。
- URL(Uniform Resource Locator):统一资源定位符,它也被称为 Web 地址。
- URN (Universal Resource Name):统一资源名称,它通过特定命名空间中的唯一名称来标识资源。
URI 示例:
http: ; //aurthur.cn:80/index.html?key1=value1&key2=value2#SomewhereInTheDocument
协议 Protocol
示例中 http:// 表示该请求的协议是超文本传输协议。
常见的协议有:
| 方案 | 描述 | 
|---|---|
| file | 指定主机上文件的名称 | 
| ftp | 文件传输协议 | 
| http/https | 超文本传输协议/安全的超文本传输协议 | 
| mailto | 电子邮件地址 | 
| view-source | 资源的源代码 | 
| ws/wss | (加密的) WebSocket 连接 | 
主机地址 Host
示例中 aurthur.cn 指明了主机地址(域名通过 DNS 服务器解析可得到 IP 地址),由它决定向哪台服务器发送请求,主机地址也可以直接填写 IP。
端口 Port
示例中 :80 表示请求 80 端口,如果不填端口则根据 Protocol 向默认端口发送请求,HTTP 协议默认端口为 80 ,HTTPS 协议默认端口为 443。
路径 Path
示例中 /index.html 表示服务器上资源的路径。
查询 Query
示例中 ?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。
片段 Fragment
示例中 #SomewhereInTheDocument 是资源本身的某一部分的一个锚点,客户端发起请求时一般不会将片段发送给服务器端。
HTTP 响应
在接收请求消息后,服务器根据请求要求返回⼀个 HTTP 响应消息,HTTP 响应也是由三个部分组成:响应行 + 响应头 + 一个空行(\r\n) + 响应数据,其中请求行组成:HTTP 协议版本 + 状态码 + 状态描述。
状态代码由三位数字组成,第⼀个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息,表示请求已接收,继续处理
- 2xx:成功,表示请求已被成功接收、理解、接受
- 3xx:重定向,要完成请求必须进⾏更进⼀步的操作
- 4xx:客户端错误,请求有语法错误或请求⽆法实现
- 5xx:服务器端错误,服务器未能实现合法的请求
常⻅状态代码、状态描述、说明:
- 200 OK:客户端请求成功
- 301 Moved Permanently:客户请求的文档在其他地方,新的 URL 在 Location 头中给出,浏览器应该自动地访问新的 URL
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域⼀起使⽤
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在
- 405 Method Not Allowed:请求方法(GET、POST、HEAD、DELETE、PUT、TRACE 等)对指定的资源不适用
- 413 Request Entity Too Large:目标文档的大小超过服务器当前愿意处理的大小
- 500 Internal Server Error:服务器发⽣不可预期的错误
- 503 Server Unavailable:服务器当前不能处理客户端的请求,⼀段时间后可能恢复正常
HTTP 头信息(HTTP Header)
请求中的头信息称为 请求头,响应中的头信息称为 响应头,他们的格式都一致:名字 + : + 值。
请求头、响应头都用的字段有:
- Cache-Control:控制缓存行为
- Connection:连接的管理
- Date:普通报头域表示消息产生的日期和时间
一般仅请求头使用字段有:
- Accept:客户端可处理的媒体类型
- Accept-Charset:客户端可处理的字符集
- Accept-Encoding:客户端的编码方式
- Accept-Langulage:客户端指定的语言类型
- Authrization:Web 认证信息
- Expect:期待服务器的特定行为
- Host:请求报头域主要用于指定被请求资源的 Internet 主机和端口号
- User-Agent:请求报头域允许客户端将它的操作系统、浏览器和其它属性
- Referer:请求中的 URL 上一跳地址
一般仅响应头使用字段有:
- Age:资源的创建时间
- Location:客户端重定向至指定的 URL
- Retry-After:再次发送请求的时机
一般有请求数据或响应数据才使用的字段有:
- Allow:资源所支持的 HTTP 请求类型
- Content-Location:替代对应资源的 URI
- Content-Encoding:数据编码方式
- Content-Language:数据的语言类型
- Content-Length:数据的大小
- Content-Type:数据的类型
- Expires:数据过期时间
- Last-Modified:资源的最后修改时间