HTTP报文详解
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。
1、HTTP请求报文
HTTP请求报文由3部分组成(请求行+请求头+请求体)
请求报文:
①是请求方法,GET和POST是最常见的HTTP方法,除此以外还有DELETE、HEAD、OPTIONS、PUT、TRACE方法。
②是请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
⑤是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html?param1=value1¶m2=value2”的方式传递请求参数。
请求结构图:
2、HTTP响应报文
HTTP响应报文由3部分组成(响应行+响应头+响应体)
响应报文:
①报文协议及版本。
②状态码及状态描述。
③响应报文头,也是由多个属性组成。
④响应报文体,即返回来的数据。
3、请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法:GET、POST、HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT方法。
4、消息头
HTTP消息头是指,在超文本传输协议(HTTP)的请求和响应消息中,协议头部分的那些组件。HTTP消息头用来准确描述正在获取的资源、服务器或者客户端的行为,定义了HTTP事务中的具体操作参数。
HTTP消息头是在客户端请求(Request)或服务器响应(Response)时传递的,位于请求或响应的第一行,HTTP消息体(请求或响应的内容)是其后传输。HTTP消息头以明文的字符串格式传送,是以冒号分隔的键值对,如:Accept-Charset:utf-8,每一个消息头最后以回车符(CR)和换行符(LF)结尾。HTTP消息头结束后,会用一个空白的字段来标识,这样就会出现两个连续的CR-LF。
Accept 能够接受的回应内容类型(Content-Types)。
示例:Accept: text/plain
Accept-Charset 能够接受的字符集。
示例:Accept-Charset: utf-8
Accept-Encoding 能够接受的编码方式列表。
示例:Accept-Encoding: gzip, deflate
Accept-Language 能够接受的回应内容的自然语言列表。
示例:Accept-Language: en-US
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 Connection: Upgrade
Cookie 之前由服务器通过Set- Cookie发送的一个超文本传输协议Cookie。
示例:Cookie: $Version=1; Skin=new;
Content-Length 以八位字节数组(8位的字节)表示的请求体的长度。
示例:Content-Length: 348
Content-MD5 请求体的内容的二进制MD5散列值,以 Base64 编码的结果。
示例:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Type 请求体的多媒体类型(用于POST和PUT请求中)。
示例:Content-Type: application/x-www-form-urlencoded
Date 发送该消息的日期和时间。
示例:Date: Tue, 15 Nov 1994 08:12:31 GMT
Expect 表明客户端要求服务器做出特定的行为。
示例:Expect: 100-continue
From 发起此请求的用户的邮件地址。
示例:From: user@example.com
Host 服务器的域名(用于虚拟主机),以及服务器所监听的传输控制协议端口号。如果所请求的端口是对应的服务的标准端口,则端口号可被省略。
示例:Host: en.wikipedia.org:80 Host: en.wikipedia.org
If-Match 仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要作用时,用作像PUT这样的方法中,仅当从用户上次更新某个资源以来,该资源未被修改的情况下,才更新该资源。
示例:If-Match: "737060cd8c284d8af7ad3082f209582d"
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。
示例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 允许在对应的内容未被修改的情况下返回304未修改(304 Not Modified)。
示例: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 发起一个针对跨来源资源共享的请求(要求服务器在回应中加入一个”访问控制-允许来源”(”Access-Control-Allow-Origin”)字段)。
示例:Origin: http://www.example-social-network.com
Pragma 与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生多种效果。
示例:Pragma: no-cache
Proxy-Authorization 用来向代理进行认证的认证信息。
示例:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 仅请求某个实体的一部分。字节偏移以0开始。
示例:Range: bytes=500-999
Referer 表示浏览器所访问的前一个页面,正是那个页面上的某个链接将浏览器带到了当前所请求的这个页面。
示例:Referer: http://en.wikipedia.org/wiki/Main_Page
TE 浏览器预期接受的传输编码方式:可使用回应协议头Transfer-Encoding字段中的值;另外还可用"trailers"(与"分块"传输方式相关)这个值来表明浏览器希望在最后一个尺寸为0的块之后还接收到一些额外的字段。
示例:TE: trailers, deflate
User-Agent 浏览器的浏览器身份标识字符串。
示例:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
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
Access-Control-Allow-Origin 指定哪些网站可参与到跨来源资源共享过程中。
示例:Access-Control-Allow-Origin: *
Accept-Patch 指定服务器支持的文件格式类型。
示例:Accept-Patch: text/example;charset=utf-8
Accept-Ranges 这个服务器支持哪些种类的部分内容范围。
示例:Accept-Ranges: bytes
Age 这个对象在代理缓存中存在的时间,以秒为单位。
示例:Age: 12
Allow 对于特定资源有效的动作。针对HTTP/405这一错误代码而使用。
示例:Allow: GET, HEAD
Cache-Control 向从服务器直到客户端在内的所有缓存机制告知,它们是否可以缓存这个对象。其单位为秒。
示例:Cache-Control: max-age=3600
Connection 针对该连接所预期的选项。
示例:Connection: close
Content-Disposition 一个可以让客户端下载文件并建议文件名的头部。文件名需要用双引号包裹。
示例:Content-Disposition: attachment; filename="fname.ext"
Content-Encoding 在数据上使用的编码类型。
示例:Content-Encoding: gzip
Content-Language 内容所使用的语言。
示例:Content-Language: da
Content-Length 回应消息体的长度,以字节(8位为一字节)为单位。
示例:Content-Length: 348
Content-Location 所返回的数据的一个候选位置。
示例:Content-Location: /index.htm
Content-MD5 回应内容的二进制MD5散列,以Base64方式编码。
示例:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 这条部分消息是属于某条完整消息的哪个部分。
示例:Content-Range: bytes 21010-47021/47022
Content-Type 当前内容的MIME类型。
示例:Content-Type: text/html; charset=utf-8
Date 此条消息被发送时的日期和时间。
示例:Date: Tue, 15 Nov 1994 08:12:31 GMT
ETag 对于某个资源的某个特定版本的一个标识符,通常是一个消息散列。
示例:ETag: "737060cd8c284d8af7ad3082f209582d"
Expires 指定一个日期/时间,超过该时间则认为此回应已经过期。
示例:Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified 所请求的对象的最后修改日期。
示例:Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
Link 用来表达与另一个资源之间的类型关系,此处所说的类型关系是在RFC 5988中定义的。
示例:Link:; rel="alternate"
Location 用来进行重定向,或者在创建了某个新资源时使用。
示例:Location: http://www.w3.org/pub/WWW/People.html
P3P 用于支持设置P3P策略,标准格式为“P3P:CP="your_compact_policy"”。然而P3P规范并不成功,大部分现代浏览器没有完整实现该功能,而大量网站也将该值设为假值,从而足以用来欺骗浏览器的P3P插件功能并授权给第三方Cookies。
示例:P3P:
CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Pragma 与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生多种效果。
示例:Pragma: no-cache
Proxy-Authenticate 要求在访问代理时提供身份认证信息。
示例:Proxy-Authenticate: Basic
Public-Key-Pins 用于缓解中间人攻击,声明网站认证使用的传输层安全协议证书的散列值。示例:
Public-Key-Pins:max-age=2592000;pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
Refresh 用于设定可定时的重定向跳转。
示例设定了5秒后跳转至http://www.w3.org/pub/WWW/People.html。
示例:Refresh: 5; url=http://www.w3.org/pub/WWW/People.html
Retry-After 如果某个实体临时不可用,则此协议头用来告知客户端日后重试。其值可以是一个特定的时间段(以秒为单位)或一个超文本传输协议日期。
示例:
Example 1: Retry-After: 120
Example 2: Retry-After: Fri, 07 Nov 2014 23:59:59 GMT
Server 服务器的名字。
示例:Server: Apache/2.4.1 (Unix)
Set-Cookie HTTP cookie。
示例:Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Status 通用网关接口协议头字段,用来说明当前这个超文本传输协议回应的状态。普通的超文本传输协议回应会使用单独的“状态行”("Status-Line")作为替代,这一点是在RFC 7230中定义的。
示例:Status: 200 OK
Strict-Transport-Security HTTP严格传输安全这一头部告知客户端缓存这一强制HTTPS策略的时间,以及这一策略是否适用于其子域名。
示例:Strict-Transport-Security: max-age=16070400; includeSubDomains
Trailer 这个头部数值指示了在这一系列头部信息由分块传输编码。
示例:Trailer: Max-Forwards
Transfer-Encoding 用来将实体安全地传输给用户的编码形式。当前定义的方法包括:分块(chunked)、compress、deflate、gzip和identity。
示例:Transfer-Encoding: chunked
Upgrade 要求客户端升级到另一个协议。
示例:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Vary 告知下游的代理服务器,应当如何对未来的请求协议头进行匹配,以决定是否可使用已缓存的回应内容而不是重新从原始服务器请求新的内容。
示例:Vary: *
Via 告知代理服务器的客户端,当前回应是通过什么途径发送的。
示例:Via: 1.0 fred, 1.1 example.com (Apache/1.1)
Warning 一般性的警告,告知在实体内容体中可能存在错误。
示例:Warning: 199 Miscellaneous warning
WWW-Authenticate 表明在请求获取这个实体时应当使用的认证模式。
示例:WWW-Authenticate: Basic
X-Frame-Options deny:该页面不允许在 frame 中展示,即使是同域名内。sameorigin:该页面允许同域名内在 frame 中展示。allow-from uri:该页面允许在指定uri的 frame 中展示。allowall:允许任意位置的frame显示,非标准值。
示例:X-Frame-Options: deny
5、状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code
常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
100 Continue
表示目前为止一切正常,客户端应该继续请求,如果已完成请求则忽略。
101 Switching Protocols
表示服务器应客户端升级协议的请求(Upgrade请求头)正在进行协议切换。
200 OK
表明请求已经成功。默认情况下状态码为200的响应可以被缓存。
201 Created
请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其URI已经随Location头信息返回。假如需要的资源无法及时创建的话,应当返回'202 Accepted'。
202 Accepted
服务器已接受请求,但尚未处理。最终该请求可能会也可能不会被执行,并且可能在处理发生时被禁止。
203 Non-Authoritative Information
服务器是一个转换代理服务器(transforming proxy,例如网络加速器),以200 OK状态码为起源,但回应了原始响应的修改版本。
204 No Content
服务器成功处理了请求,没有返回任何内容。
205 Reset Content
服务器成功处理了请求,但没有返回任何内容。与204响应不同,此响应要求请求者重置文档视图。
206 Partial Content
服务器已经成功处理了部分GET请求。类似于迅雷这类的HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
300 Multiple Choices
表示重定向的响应状态码,表示该请求拥有多种可能的响应。用户代理或者用户自身应该从中选择一个。由于没有如何进行选择的标准方法,这个状态码极少使用。
301 Moved Permanently
永久重定向,说明请求的资源已经被移动到了由Location头部指定的URL上,是固定的不会再改变。搜索引擎会根据该响应修正。
302 Found
请求的资源被暂时的移动到了由Location头部指定的URL上。浏览器会重定向到这个URL, 但是搜索引擎不会对该资源的链接进行更新。
303 See Other
通常作为PUT或POST操作的返回结果,它表示重定向链接指向的不是新上传的资源,而是另外一个页面,比如消息确认页面或上传进度页面。而请求重定向页面的方法要总是使用 GET。
304 Not Modified
未改变说明无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法(safe),例如GET或HEAD或在请求中附带了头部信息:If-None-Match或If-Modified-Since。
305 Use Proxy
被请求的资源必须通过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能创建305响应。
307 Temporary Redirect
在这种情况下,请求应该与另一个URI重复,但后续的请求应仍使用原始的URI。与302相反,当重新发出原始请求时,不允许更改请求方法。例如,应该使用另一个POST请求来重复POST请求。
308 Permanent Redirect
请求和所有将来的请求应该使用另一个URI重复。307和308重复302和301的行为,但不允许HTTP方法更改。例如,将表单提交给永久重定向的资源可能会顺利进行。
400 Bad Request
由于明显的客户端错误(例如,格式错误的请求语法,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求。
401 Unauthorized
指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。
402 Payment Required
该状态码是为了将来可能的需求而预留的。该状态码最初的意图可能被用作某种形式的数字现金或在线支付方案的一部分,但几乎没有哪家服务商使用,而且这个状态码通常不被使用。
403 Forbidden
指的是服务器端有能力处理该请求,但是拒绝授权访问。
404 Not Found
指的是服务器端无法找到所请求的资源。返回该响应的链接通常称为坏链(broken link)或死链(dead link),它们会导向链接出错处理页面。
405 Method Not Allowed
表明服务器禁止了使用当前HTTP方法的请求。需要注意的是,GET与HEAD两个方法不得被禁止,当然也不得返回状态码405。
406 Not Acceptable
指代服务器端无法提供与Accept-Charset以及Accept-Language消息头指定的值相匹配的响应。
407 Proxy Authentication Required
指的是由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器(proxy server)要求的身份验证凭证,发送的请求尚未得到满足。
408 Request Timeout
请求超时。根据HTTP规范,客户端没有在服务器预备等待的时间内完成一个请求的发送,客户端可以随时再次提交这一请求而无需进行任何更改。
409 Conflict
表示因为请求存在冲突无法处理该请求,例如多个同步更新之间的编辑冲突。
410 Gone
说明请求的内容在服务器上不存在,同时是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用404。
411 Length Required
服务器拒绝在没有定义Content-Length头的情况下接受请求。在添加了表明请求消息体长度的有效Content-Length头之后,客户端可以再次提交该请求。
412 Precondition Failed
服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 Request Entity Too Large
表示请求主体的大小超过了服务器规定的限度,服务器可以选择关闭连接或者返回 Retry-After首部字段。
414 Request-URI Too Long
表示客户端所请求的URI超过了服务器允许的范围。
415 Unsupported Media Type
表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。
416 Requested Range Not Satisfiable
客户端已经要求文件的一部分(Byte serving),但服务器不能提供该部分。例如,如果客户端要求文件的一部分超出文件尾端。
417 Expectation Failed
在请求头Expect中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服显的证据证明在当前路由的下一个节点上,Expect的内容无法被满足。
500 Internal Server Error
通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。没有给出具体错误信息。
501 Not Implemented
服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 Service Unavailable
表示服务器尚未处于可以接受请求的状态。
504 Gateway Timeout
表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响应。
505 HTTP Version Not Supported
表示服务器不支持请求所使用的HTTP版本。
6、Content-Type
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
Content-Type对照表:
本文分享自 AllTests软件测试 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!