详解HTTP常用知识点

详解HTTP常用知识点

本文搜集了一些非常实用的HTTP知识点,可以帮助日常网络请求调试快速定位问题。内容主要包含了HTTP状态码和HTTP首部字段。

HTTP返回状态码

HTTP状态码代表了HTTP网络请求返回结果的状态。在RFC2616上记录的HTTP状态码大约40种,加上其他文档中扩充的HTTP状态码,总数大约不超过100个。在这些状态码当中,日常实际经常使用的大概只有14种。状态码以3位数字和原因短语组成,1XX状态码代表信息性状态码,2XX状态码代表成功状态码,3XX状态码代表重定向,4XX状态码代表客户端错误,5XX状态码代表服务端错误。

1XX 信息

  • 101 Switching Protocols
    转换协议。例如当客户端请求发起WebSocket连接时,会先以Upgrade:websocket的请求头HTTP请求开始,接着服务端就会返回101状态码的响应,将连接升级到Websocket。

2XX成功

  • 200 OK
    代表从客户端发送的http请求被服务端正常处理,并正确返回了处理结果。
  • 204 No Content
    代表请求处理成功,但没有资源可返回。如果浏览器接收到204返回,那么浏览器的页面不发生更新。通常在只需要客户端向服务端发送信息的场景下使用。
  • 206 Partial Content
    返回该状态码时说明客户端的请求发起了资源范围请求(请求头中包含Range),服务端处理了范围请求,并将指定范围的资源返回(返回头中包含Content-Range)。

3XX重定向

  • 301 Moved Permanently
    代表请求的资源已经永久重定向。此时服务端的返回头中会包含Location字段,该字段将指示资源重定向之后的新URI,浏览器接收后会直接跳转到新的URI。
  • 302 Found
    代表请求的资源临时性重定向。区别于永久重定向,服务端返回302状态时希望客户端只在此次请求中用Location字段中新的URI去请求资源,以后仍然使用老的URI请求资源。是Http1.0遗留的状态码。
  • 303 See Other
    类似于302临时重定向,303也指示客户端以另一个URI去请求资源。但是303指示客户端以GET方法去获取资源。303是Http1.1为了细化302而增加的状态码。
  • 304 Not Modified
    当客户端附带条件请求时(请求头中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since),服务端因请求未满足条件,可能会返回304状态码。当返回304状态码时,服务端的返回不包含任何主体,客户端将直接从缓存中加载对应资源。304和3XX系状态码不同,304与重定向毫无关系。
  • 307 TemporaryRedirect
    临时重定向。如果请求是Get和Head方法,则浏览器可以重定向。其他Http方法浏览器不可以重定向请求。307是Http1.1为了细化302而增加的状态码。

4XX客户端错误

  • 400 Bad Request
    请求报文中存在语法错误。
  • 401 Unauthorized
    请求未通过Http认证(BASIC认证、DIGEST认证)。返回401时服务端必须返回一个用于认证的信息,以供客户端弹出认证会话窗口。
  • 403 Forbidden
    请求被服务器拒绝(服务端没有必要给出理由),或者访问权限不正确。
  • 404 Not Found
    没有请求的资源。

5XX服务器错误

  • 500 Internal Server Error
    服务端在执行请求时发生了错误,可能是某些服务器临时的故障,也可能是服务本身存在bug。
  • 503 Service Unavailable
    该状态表明服务器现在超负荷或者正在停机维护,现在无法处理请求。同时建议服务端配合Retry-After返回头告知客户端多久之后可以再次请求。

HTTP首部字段

http首部字段由固定格式组成,“首部字段名:字段值”。包含四种http首部字段类型,分别为通用首部字段、请求首部字段、响应首部字段、实体首部字段。
HTTP/1.1规范定义了如下47种首部字段。
通用首部字段:
Cache-Control,Connection,Date,Pragma,Trailer,Transfer-Encoding,Upgrade,Via,Warning
请求首部字段:
Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Except,From,Host,If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,Max-Forwards,Proxy-Authorization,Range,Referer,TE,User-Agent
响应首部字段
Accept-Ranges,Age,ETag,Location,Proxy-Authenticate,Retry-After,Server,Vary,WWW-Authenticate
实体首部字段
Allow,Content-Encoding,Content-Language,Content-Length,Content-Location,Content-MD5,Content-Range,Content-Type,Expires,Last-Modified
实际中还包含一些非HTTP/1.1首部字段,例如常见的Cookie,Set-Cookie等在其他RFC中定义的首部字段。
下面将会挑选实际中使用率非常高的首部字段进行详细说明。

通用首部字段

  • Cache-Control
    请求和响应中的Cache-Control有着不太相同的作用。
    请求中的Cache-Control指令:
    no-cache,no-store,max-age=[s],max-stale=[s],min-fresh=[s],no-transform,only-if-cached,cache-extension
    响应中的Cache-Control指令:
    public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate,max-age=[s],s-maxage=[s],cache-extension
    常见的指令有no-cache和no-store。当在请求中出现Cache-Control:no-cache或Cache-Control:no-store时,代表客户端不接受任何缓存(本地、代理服务器、网关)的响应,必须从服务器获取最新的资源以返回。当在响应中出现Cache-Control:no-cache时,代表接收方可以缓存响应的资源,但是每次使用必须获得服务端的批准(缓存仍未过期)。当在响应中出现Cache-Control:no-store时,代表服务器不允许任何接收方缓存响应的资源。
  • Connection
    Connection首部具有两个作用:1、控制不再转发的首部字段;2、管理持久连接;他的第一点作用也许不太为众人所知。
    当指令中出现其他首部字段时,启动第一种作用。例如Connection:Upgrade,就代表第一个接收方(可能是路由器、代理服务器、网关等)接收到之后,把Upgrade首部删除之后再继续转发。
    当出现如下指令时,Connection管理持久连接。Connection:Keep-Alive、Connection:close
  • Date
    Date首部代表创建HTTP报文的日期和时间。
    早先的Date格式为:
    Date:Tue Jul 03 04:40:59 2012或者Date:Tue, 03-Jul-12 04:40:59 GMT
    HTTP/1.1协议使用的日期格式为:
    Date:Tue, 03 Jul 2012 04:40:59 GMT
  • Upgrade
    该首部字段用于检测HTTP协议及其他协议是否可使用更高版本进行通信,常用的有将HTTP升级为WebSocket。Upgrade:WebSocket

请求首部字段

  • Accept
    该字段通知服务端,客户端能够处理的媒体类型及优先级。指令使用type/subtype的形式,例如Accept:text/html,application/xml;q=0.9,/;q=0.8。该首部值代表客户端用1的权重接收text/html,用0.9的权重接收application/xml,用0.8的权重接收所有媒体类型。
    多个指令中间用逗号分隔。可以为单个指令增加优先级,q=代表权重,取值范围为0-1,1位最大,默认为1,单个指令和优先级之间用分号分隔。注意首部字段中分号用于做小间隔,逗号用于做大间隔。
    常见的媒体类型如下。
    文本文件:
    text/html,text/plain,text/css,application/xhtml+xml,application/xml
    图片文件
    image/jpeg,image/gif,image/png
    视频文件
    video/mpeg,video/quicktime
    应用程序使用的二进制文件
    application/octet-stream,application/zip
  • Host
    该请求头代表请求的目标服务器所在的地址。例如Host:www.baidu.com
  • Referer
    该首部告知服务端,发起请求的客户端所在额地址URI。例如Referer: https://www.baidu.com。另外,Referer的正确拼写应该是Referrer,使用Referer是历史错误。

响应首部字段

  • Location
    该字段通常配合3xx的重定向状态码,Location的指令内容代表引导客户端重定向至一个新的URI。例如Location:http://www.baidu.com

实体首部字段

  • Allow
    该字段用于告知客户端,服务端能够支持的HTTP方法。例如Allow:GET,HEAD
  • Content-Location
    该字段指示响应的资源所在的URI。其值就等于响应返回的资源的确切地址。
  • Content-Type
    该字段指示实体主体内对象的媒体类型。
  • Expires
    该字段代表响应的资源失效的时间。

其他首部字段

  • Set-Cookie、Cookie
    Set-Cookie首部字段可以向客户端浏览器中写入cookie,已提供保存某些会话信息。下一次的客户端浏览器再发起请求时,会携带Cookie首部字段,以出示会话信息。但是如果Set-Cookie中指示HttpOnly,则在客户端浏览器中JavaScript脚本将无法读取和修改此cookie。
  • Access-Control-Allow-Origin
    支持跨域请求的服务端在与客户端进行预检请求(OPTIONS)时,会携带的首部字段。该字段指明支持跨域请求的白名单,如果为*则表示接受任何客户端的请求。

猜你喜欢

转载自blog.csdn.net/yuhk231/article/details/98747107