万猫学社
2022-02-11 09:31:20浏览 1227
无论你是Java、PHP开发者,还是运维人员,只要从事互联网行业,面试时都可能被问到HTTP协议相关知识。历时多天的呕心沥血,为你总结了HTTP协议的经典面试题。由于涉及内容比较繁杂不方便记忆,建议收藏起来,时不时看一遍或者面试前突击复习。
什么是HTTP报文?
HTTP报文是HTTP协议在客户端和服务端之间传送的数据块。
HTTP报文由哪三部分组成?
HTTP报文由起始行(start line)、头部(header)和主体(body)三部分组成,起始行是对报文进行的描述,头部包含报文的一些属性,主体包含报文的数据(可选,非必选)。
HTTP报文分为哪两类?
HTTP报文可以分为:请求报文(request message)和响应报文(response message)。当客户端向服务端发送请求时,就是发送请求报文;当服务端向客户端返回数据时,就是返回响应报文。比如,获取一个文本需要的请求报文和响应报文:
HTTP常见的请求方法有哪些?
| 方法 |
描述 |
是否包含主体 |
|---|
| GET |
从服务端获取指定信息 |
否 |
| POST |
向服务端发送待处理的数据 |
是 |
| HEAD |
从服务端获取指定信息的头部 |
否 |
| PUT |
向服务端发送数据并替换服务端上指定的数据 |
是 |
| OPTIONS |
查询针对请求URL指定的资源支持 |
否 |
| DELETE |
从服务端删除指定数据 |
否 |
| TRACE |
沿着目标资源的路径执行消息环回测试 |
否 |
HTTP的状态码分为哪几类?
| 整体范围 |
已定义范围 |
分类 |
|---|
| 100~199 |
100~101 |
信息提示 |
| 200~299 |
100~206 |
成功 |
| 300~399 |
300~305 |
重定向 |
| 400~499 |
400~415 |
客户端错误 |
| 500~599 |
500~505 |
服务端错误 |
HTTP常见的状态码有哪些?
| 状态码 |
原因短语 |
含义 |
|---|
| 100 |
Continue |
说明收到了请求的初始部分,请客户端继续。 |
| 101 |
Switching Protocols |
说明服务端正在根据客户端的指定,将协议切换成Update头部所列的协议。 |
| 200 |
OK |
请求没有问题,主体包含了所请求的数据。 |
| 201 |
Created |
用于在服务端创建数据的请求(比如PUT),Location头部给出了创建数据的URL。 |
| 202 |
Accepted |
请求已经被接受,但服务端还没有对其执行任何动作。 |
| 203 |
Non-Authoritative Information |
数据已经正常地返回,但一些响应报文头部可能不正确。 |
| 204 |
No Content |
响应报文中包含起始行和头部,没有主体部位。客户端应该继续显示原来的数据。 |
| 205 |
Reset Content |
仍然没有主体部分,但客户端应该清除它所显示的数据。 |
| 206 |
Partial Content |
成功执行了一部分或者一个范围内的请求。 |
| 300 |
Multiple Choices |
客户端请求了一个实际指向多个资源的URL,服务端可以在Location头部包含首选URL。 |
| 301 |
Moved Permanently |
请求的URL已经被移除,响应报文中的Location头部包含现在资源的URL。 |
| 302 |
Found |
类似于301,但新的URL应该被视为临时性的,将来的请求仍应是老的URL。 |
| 303 |
See Other |
类似于301,但主要目的是允许POST请求的响应将客户端定向到某个资源上。 |
| 304 |
Not Modified |
客户端有缓冲的文档并发出了一个条件性的请求时,服务端告知客户端,原来缓冲的数据还可以继续使用。 |
| 305 |
Use Proxy |
用来说明必须通过代理进行访问,代理的位置在Location头部给出。 |
| 306 |
- |
未使用 |
| 307 |
Temporary Redirect |
类似于301,但客户端应该使用Location头部给出的URL临时请求,将来的请求仍应是老的URL。 |
| 400 |
Bad Request |
客户端发出的是错误请求,服务器无法理解。 |
| 401 |
Unauthorized |
请求要求客户端的身份认证 |
| 402 |
Payment Required |
保留,以作将来使用 |
| 403 |
Forbidden |
服务端理解客户端的请求,但是拒绝执行此请求。 |
| 404 |
Not Found |
服务端无法找到客户端所请求的URL。 |
| 405 |
Method Not Allowed |
服务端不支持客户端请求的方法。 |
| 406 |
Not Acceptable |
服务端无法根据客户端请求的类型完成请求。 |
| 407 |
Proxy Authentication Required |
类似于401,但用于要求对资源进行认证的代理服务器。 |
| 408 |
Request Timeout |
服务端等待客户端发送的请求时间过长,服务端可以响应此状态码,并关闭连接。 |
| 409 |
Conflict |
客户端的请求可以在资源上引发一些冲突,服务端可以发送此状态码。 |
| 410 |
Gone |
类似于404,但是服务端曾经拥有过此资源。 |
| 411 |
Length Required |
服务端要求客户端的请求报文中包含Content-Length头部时,使用此状态码。 |
| 412 |
Precondition Failed |
客户端发起了条件请求,并且其中一个条件失败时,使用此状态码。 |
| 413 |
Request Entity Too Large |
客户端发送的主体部分比服务端能够或者期望处理的要大时,使用此状态码。 |
| 414 |
Request URI Too Large |
客户端发送的请求URI比服务端能够或者期望处理的要长时,使用此状态码。 |
| 415 |
Unsupported Media Type |
服务端无法理解或无法支持客户端所发的内容类型是,使用此状态码。 |
| 416 |
Requested Range Not Satisfiable |
客户端请求指定资源的范围无效或无法满足。 |
| 417 |
Expectation Failed |
服务端无法满足客户端的Expect头部。 |
| 500 |
Internal Server Error |
服务端发生内部错误,无法完成请求。 |
| 501 |
Not Implemented |
服务端不支持客户端的请求,无法完成请求。 |
| 502 |
Bad Gateway |
作为网关或代理的服务器,从远端服务端接收到了一个无效的请求。 |
| 503 |
Service Unavailable |
用来说明服务端现在无法为请求提供服务,但是将来可以。什么时候资源会变为可用可包含在服务端的Retry-After头部中。 |
| 504 |
Gateway Timeout |
类似于408,只是作为网关或代理的服务器,未及时从远端服务端获取请求。 |
| 505 |
HTTP Version Not Supported |
服务端不支持请求的HTTP协议的版本,无法完成处理。 |
HTTP常见的头部信息有哪些?
请求报文的头部信息
| Header |
含义 |
示例 |
|---|
| Accept |
指定客户端能够接收的内容类型。 |
Accept: text/html,application/xhtml+xml |
| Accept-Charset |
客户端可以接受的字符编码集。 |
Accept-Charset: GBK |
| Accept-Encoding |
客户端可以支持的服务端返回内容压缩编码类型。 |
Accept-Encoding: gzip, deflate |
| Accept-Language |
客户端可接受的语言 |
Accept-Language: zh-CN,zh |
| Authorization |
HTTP授权的授权证书 |
Authorization: Basic b25lbW9yZSUzQSV1NEUwNyV1NzMyQiV1NUI2NiV1NzkzRQ== |
| Cache-Control |
指定请求和响应遵循的缓存机制 |
Cache-Control: no-cache |
| Connection |
表示是否需要持久连接。 |
Connection: keep-alive |
| Cookie |
HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给服务端。 |
Cookie: onemore=万猫学社; |
| Content-Length |
请求的内容长度 |
Content-Length: 1024 |
| Content-Type |
请求的与实体对应的MIME信息 |
Content-Type: application/x-www-form-urlencoded |
| Date |
请求发送的日期和时间 |
Date: Mon, 16 Mar 2020 11:11:11 GMT |
| Expect |
请求的特定的服务端行为 |
Expect: 100-continue |
| Host |
指定请求的服务端的域名和端口号 |
Host: onemore.study |
| If-Match |
只有请求内容与实体相匹配才获取该数据 |
If-Match: “306073f04224cbd114f14693c272f6a0” |
| If-Modified-Since |
如果请求的部分在指定时间之后被修改则请求成功。 |
If-Modified-Since: Mon, 16 Mar 2020 11:11:11 GMT |
| If-None-Match |
只有请求内容与实体不匹配才获取该数据。 |
If-None-Match: “306073f04224cbd114f14693c272f6a0” |
| If-Range |
允许对数据的某个范围进行条件请求。 |
If-Range: “306073f04224cbd114f14693c272f6a0” |
| If-Unmodified-Since |
只有在指定时间之后未被修改才请求成功。 |
If-Unmodified-Since: Mon, 16 Mar 2020 11:11:11 GMT |
| Max-Forwards |
将请求转发给其他代理或网关的最大次数。 |
Max-Forwards: 10 |
| Pragma |
用来包含实现特定的指令 |
Pragma: no-cache |
| Proxy-Authorization |
连接到代理的授权证书 |
Proxy-Authorization: Basic b25lbW9yZSUzQSV1NEUwNyV1NzMyQiV1NUI2NiV1NzkzRQ== |
| Range |
只请求数据的一部分,指定范围 |
Range: bytes=512-1024 |
| Referer |
先前资源的URL |
Referer: http://onemore.study |
| TE |
客户端愿意接受的传输编码 |
TE: trailers,deflate;q=0.5 |
| User-Agent |
包含发出请求的客户端信息 |
User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:65.0) |
响应报文的头部信息
| Header |
含义 |
示例 |
|---|
| Age |
从原始服务端到代理缓存形成的估算时间(以秒计,非负) |
Age: 12 |
| Allow |
对某资源的有效的请求行为 |
Allow: GET, POST |
| Cache-Control |
告诉所有的缓存机制是否可以缓存及哪种类型。 |
Cache-Control: no-cache |
| Content-Encoding |
服务端支持的返回内容压缩编码类型。 |
Content-Encoding: gzip |
| Content-Language |
响应体的语言 |
Content-Language: zh-CN,zh |
| Content-Length |
响应体的长度 |
Content-Length: 1024 |
| Content-Location |
请求资源实际所处位置 |
Content-Location: /index.do |
| Content-MD5 |
返回资源的MD5校验值 |
Content-MD5: 306073f04224cbd114f14693c272f6a0 |
| Content-Range |
在整个返回资源中本部分的字节位置 |
Content-Range: bytes 512-1024 |
| Content-Type |
返回资源的对象类型 |
Content-Type: text/html; charset=GBK |
| Date |
原始服务端消息发出的时间 |
Date: Mon, 16 Mar 2020 11:11:11 GMT |
| ETag |
请求变量的实体标签的当前值 |
ETag: “306073f04224cbd114f14693c272f6a0” |
| Expires |
响应过期的日期和时间 |
Expires: Mon, 16 Mar 2020 11:11:11 GMT |
| Last-Modified |
请求资源的最后修改时间 |
Last-Modified: Mon, 16 Mar 2020 11:11:11 GMT |
| Location |
告知客户端资源的实际URL |
Location: http://onemore.study |
| Pragma |
包括实现特定的指令 |
Pragma: no-cache |
| Proxy-Authenticate |
它指出认证方案和可应用到代理的该URL上的参数 |
Proxy-Authenticate: Basic |
| Retry-After |
如果实体暂时不可取,通知客户端在指定时间之后再次尝试 |
Retry-After: 60 |
| Server |
服务端软件名称 |
Server: Microsoft-IIS/8.5 |
| Set-Cookie |
设置Http Cookie |
Set-Cookie: onemore=万猫学社; |
| Transfer-Encoding |
文件传输编码 |
Transfer-Encoding:chunked |
| Vary |
告知下游代理是使用缓存响应还是从原始服务端请求 |
Vary: * |
| Via |
告知代理客户端响应是通过哪里发送的 |
Via: HTTP/1.1 GWA |
| WWW-Authenticate |
表明客户端请求实体应该使用的授权方案 |
WWW-Authenticate: Basic |