【HTTP】HTTP报文&状态码
HTTP报文中的HTTP信息
一、编码提升传输速率
编码的好处:有效处理大量的访问请求
编码的弊端:会消耗更多的CPU资源
报文主体&实体主体
报文:HTTP通信的基本单元,8位组字节流组成,通过HTTP通信传输
实体:作为请求或响应的有效载荷数据被传输,实体首部+实体主体
一般情况下 报文=实体
编码操作时 报文≠实体 实体主体的内容发生了变化
常见的内容编码:gzip、compress(UNIX系统的标准编码)、deflate、identity(不编码)
分块传输编码:将实体主体分块,分割发送数据,逐步显示在页面。
二、发送多种数据的多部分对象集合
MIME多用途因特网邮件扩展机制:允许邮件处理文本、图片、视频等多个不同类型的数据。MIME中使用多部分对象集合的方法来容纳多份不同类型的数据。
多部分对象集合包含的对象包括:
1. multipart/form-data:在Web表单文件上传时使用
2. multipart/byteranges:状态码为206 Partial Content响应报文包含多个范围的内容时使用
三、获取部分内容的范围请求
下载中断问题的解决:可恢复机制,从下载出恢复下载
可恢复机制的实现:在请求中指定下载的实体范围。
例如:
请求5001-10000字节:Range: bytes=5001-10000
请求5001之后全部的内容:Range: bytes=5001-
从一开始到3000字节和5000-7000字节的多重范围:Range: bytes=-3000, 5000-7000
响应会返回状态码位206Partial Content的响应报文,如果是多重范围的范围请求,会在首部字段的Content-Type中标明multipart/byteranges。
如果服务器无法响应范围请求,则会返回状态码200OK和完整的实体请求
四、内容协商
内容协商机制:客户端和服务端就响应的资源内容进行交涉,提供给客户端最为合适的资源。内容协商的判断基准:响应资源的语言、字符集、编码方式等。
具体的应用举例:当浏览器默认语言是英语/中文,访问相同的WEB页面,显示对应的英文/中文。
请求报文中的某些首部字段可以作为判断的基准:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language
内容协商技术的三种类型:
1. 服务器驱动协商:以请求的首部字段作为参考,在服务端处理。以浏览器发送的信息作为判定依据,对用户而言不一定最优。
2. 客户端驱动协商:用户在浏览器中进行选择。或者利用JavaScript脚本在Web页面上字段进行选择。例如根据OS和浏览器类型,自动切换为PC页面/手机页面。
3. 透明协商:服务器驱动协商+客户端驱动协商
HTTP状态码
一、HTTP状态码及其分类
状态码:表示HTTP请求的返回结果,用于标记服务器端处理是否正常,通知出现的错误。
类别 | 原因 | |
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误 | 服务端无法处理请求 |
5XX | 服务端错误 | 服务处理请求出错 |
二、成功状态码2XX
1. 200 OK
表明从客户端发来的请求在服务端正常处理了。响应报文内,随状态码一起返回的信息会根据方法的不同而不同。GET获取到的信息是请求资源的实体。HEAD获取到的是实体首部,不获取实体的主体部分。
2. 204 OK
表明服务器接收的请求已经成功处理,但是返回的响应报文中不包含实体的主体部分。例如,浏览器发出请求后得到204响应,则浏览器显示的页面不会更新。
使用场景:需要客户端向服务端发信息,但不需要发送新信息内容。
3. 206 Partial Content
表示客户端发送了范围请求,服务端成功处理了请求。响应报文中包含由Content-Range指定范围的实体内容。
三、3XX重定向
3XX表明浏览器需要执行某些特殊的处理,从能正确处理请求
1. 301 Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的URI,之后使用的资源是新的URI的内容。(客户端要主动变更书签引用)【搬家房子卖了】
2. 302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。(客户端不需要操作)已移动的资源对象的URI将来可能还会发生改变。【去旅游了暂时住在宾馆 旅游结束还可以回去】
3. 303 See Other
表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。类似于302,但303明确表示了要让客户端用GET方法获取资源。
例如:使用POST访问CGI程序,执行结果是希望客户端以GET方法重定向到另一个URI,返回303。(现在很多浏览器将302视为303)
4. 304 Not Modified
表示客户端发送附带条件(GET请求报文中包含if-match/if-modified-since/if-none-match/if-range/if-unmodified-since)的请求时,服务端允许请求访问资源,但是不满足条件。304返回时,不包含任何响应的主体部分。【虽然是3XX但是和重定向无关】
说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法(safe),例如GET 或HEAD 或在请求中附带了头部信息: If-None-Match 或If-Modified-Since。
如果是 200 OK ,响应会带有头部 Cache-Control, Content-Location, Date, ETag, Expires,和 Vary.
5. 307 Temporary Redirect
临时重定向,和302相同,302禁止POST变换为GET,但大家不遵守。307会遵照浏览器的标准,不会从POST变成GET,但是处理响应时的行为,不同的浏览器有不同的情况。
四、客户端错误4XX
1. 400 Bad Request
请求报文中存在语法错误,服务端无法理解请求。浏览器会像200 OK一样对待该状态码。
2. 401 Unauthorized
请求需要由通过HTTP认证的认证信息。如果之前已经进行过1此请求,则表示用户认证失败。必须包含一个适用于被请求资源的WWW-Authenticate首部用于质询用户信息。当浏览器初次接收到401时弹出认证的堆化窗口。
3. 403 Forbidden
请求资源的访问被服务器拒绝了。例如:没有获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源ip地址视图访问)
4. 404 Not Found
服务器上无法找到请求的资源。
五、服务端错误5XX
1. 500 Internal Servcer Error
服务器在执行请求时发生了错误。Web应用中存在bug或某些临时的障碍。
2. 503 Serivce Unavailable
表明服务器很忙,处于超负载或正在进行停机维护,现在无法处理请求。如果直到接触繁忙状态需要的时间,可以写入Retry-After首部字段再返回给客户端。
状态码和状态的不一致:web应用程序的内部发生错误,状态码仍为200 OK的情况,也时常发生。