前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTTP 报文

HTTP 报文

作者头像
Yif
发布2019-12-26 15:27:00
1.3K0
发布2019-12-26 15:27:00
举报
文章被收录于专栏:Android 进阶
undefined
undefined

HTTP 报文分为请求报文与响应报文。

当客户端发出一个请求,服务器就会做出响应,返回一个响应报文。无论是请求报文还是响应报文都是由三部分组成:Line ,header,body。

请求报文

格式

代码语言:javascript
复制
<Request Method>空格<Request URL>空格<Http版本号>
<Key>:<Value>
<Key>:<Value>
不可缺少的空行
<Entity Body>

请求行(request line)

请求行是由三部分组成:

  • 请求方法:比如GET或者POST,表示对资源的操作
  • 请求目标:是一个URI,请求方法要操作资源的位置
  • 版本号:即HTTP 协议版本 三部分以空格SP来分隔,最后以CRLF结束。 比如:POST /yif.com HTTP/1.1
  • POST:表示请求方法,对资源的操作
  • yif.com:请求资源的web地址
  • HTTP 1.1:HTTP 版本号

请求头

请求头是由键值对组成,key与value之间以":"进行分隔,最后以CRLF表示结束,比如Content-Length:56,这里的Content-Length表示key,value是56。 HTTP头部字段使用非常灵活,我们可以使用已有的头部,还可以自定义头部。但是再使用头部字段需要注意以下几点:

  • 字段名不区分大小写:比如Host,也可以写为host,一样被服务器识别;
  • 字段之间不允许出现空格,可以使用连接符"-",但不能使用下划线"_",比如"ztz-yif"合法,但是"ztz_yif"不合法;
  • 字段后面必须紧跟":",不能有空格,但是冒号前面字段可以有多个空格;
  • 字段可以使用任意的顺序;
  • 字段原则不难重复,除非字段语义运行,比如Set-Cookie;

请求数据

又称为请求体,与请求正文。

响应报文

格式

代码语言:javascript
复制
<Http Version>空格<Status Code>空格<Reason Phrase>
<Key>:<Value>
<Key>:<Value>
不可缺少的空行
<Entity Body>

状态行(status line)

称为服务器响应的状态。用户返回客户端对服务器请求的结果。 状态行也是三部分组成:

  • 版本号:表示HTTP 协议版本号;
  • 状态码:三位数字,比如404:客户端请求资源不存在,也就是客户端出错;
  • 原因短语:对前面状态码的补充,方便理解;

消息报头

格式与意义与请求报文一一致。比如:Header有的只能用在响应报文中,有的只能用在请求报文中,有的两者皆可用。

响应正文

又称之为响应体,就是客户端请求服务器返回的结果内容,可以是文本、音频、视频等等。

HTTP 首部

首都字段有 4 种类型:分为通用首部字段、请求首部字段、响应首部字段和实体首部字段。

  • 通用首部字段:请求报文与响应报文都会使用的首部;
  • 请求首部字段:从客户端向服务器发送报文使用的首部。补充请求的附加信息,客户端信息,响应内容等相关优先级信息;
  • 响应首部字段:从服务器向客户端返回响应报文的首部,补充了响应的附加内容,也会要求客户端附加额外信息;
  • 实体首部字段:针对请求报文与响应报文实体使用的首部。补充了资源内容更新时间与实体信息;

HTTP首部字段将定义成缓存代理与非缓存代理,分为两种类型:

  • 端到端首部:分在此类别的首部会转发请求/响应对应的最终目标,且必须保存在由缓存生成的响应中,另外规定它必须转发
  • 逐跳首部:分在此类别的首部只对单次有效,会应通过缓存或代理不再转发。HTTP 1.1及之后版本,如果使用hop-by-hop字段,则需要connection首部字段。 逐跳首部字段有: 1.connection 2.keep-alive 3,proxy-authenticate 4.proxy-authorization 5.tralier 6.TE 7.transfer-encoding 8.upgrade Transfer-Encoding: chunked表示,意思是报文里的 body 部分不是一次性发过来的,而是分成了许多的块(chunk)逐个发送。 分块传输也可以用于“流式数据”,例如由数据库动态生成的表单页面,这种情况下 body 数据的长度是未知的,无法在头字段"Content-Length"里给出确切的长度,所以也只能用 chunked 方式分块发送。 "Transfer-Encoding: chunked"和"Content-Length"这两个字段是互斥的,也就是说响应报文里这两个字段不能同时出现,一个响应报文的传输要么是长度已知,要么是长度未知。

通用首部字段

字段名

说明

Cache-Control

控制缓存行为

Connection

控制不再转发给代理的首部字段、管理持久连接

Date

创建报文的日期时间

Pragma

用于包含实现特定的指令

Trailer

报文末端首部一览

Transfer-Encoding

指定报文传输的编码格式

Upgrade

升级HTTP协议

Via

代理服务器相关信息

Warning

错误通知

请求首部字段

Accept:用户代理可处理的媒体类Accept:用户代理可处理的媒体类A型

  • 文本文件:text/html、text\plain、text\css等 = 图片文件:image/jped、image/png,image/gif
  • 视频文件:video/mpeg、video/quicktime
  • 应用程序使用的二进制文件:application/zip

比如:Accept:text/html、application/xml;q=0.8 在媒体类型后用分号隔开,使用q来表示权重,优先级,没有指定q即为1.0,优先级最高,范围是0-1可以精确到小数后3位。

if-xxx的请求字段,都可以成为条件请求,服务器接收到请求后,只有判断条件为真才会执行。 比如:

  • if-match:"123456" 会告知服务器需要匹配资源所用的实体字段值(ETag),只有if-match与资源的ETag值一致,才会执行请求,而if-none-match相反,不一致才会执行请求。
  • if-modified-since:指定日期后,资源更新,服务器才会接收请求,否则无法接收请求。
  • if-unmodified-since相反,指定日期后,资源更新就无法接收请求
  • if-range :if-range字段值与etag值或者更新日期时间匹配一直,就做范围请求,否则返回全体资源

User Agent:用户代理,作为访问者来代理发起请求,即Http协议里的请求方客户端。 通常浏览器在发送请求时都会带着"Accept-Encoding"头字段,里面是浏览器支持的压缩格式列表,例如 gzip、deflate、br 等,这样服务器就可以从中选择一种压缩算法,放进"Content-Encoding"响应头里,再把原数据压缩后发给浏览器。

通过Range来获取范围请求,并指定资源byte的范围 比如:

代码语言:javascript
复制
5001-10000字节
Range:bytes=50001-10000
5000后的全部
Range: bytes = 5000-
1300-4000,5000-10001两个范围
Range: bytes = 1300-4000,5000-10001 
Range: bytes = -500;获取最后500个字节
Range:bytes = 0-0,-1;仅要第一个与最后一个字节

Range 条件请求:指的是如果客户端已经得到这部分响应,想要该响应未过期前,获取其他部分响应,常与If-Unmodified-Since或者If-Match头部共同使用。 比如:断点续传中,使用到条件请求,来查看服务器是否修改资源,资源是否过期;服务器资源是否在两次下载之间发生改变,如果发生了变化。通过412状态码知道发生变换,得重新获取响应。

字段名

说明

Accept

客户端可以接受的媒体类型

Accept-Charset

客户端可以接受的字符编码集

Accept-Encoding

浏览器支持服务器返回的压缩格式列表

Accept-Language

浏览器可以支持的语言

Authorization

Web认证信息

Expect

请求服务器的特定行为

From

发出请求的用户邮箱地址

Host

请求资源所在的服务器地址

If-Match

只有请求内容与实体一样才有效

If-Modified-Since

如果请求的内容在指定时间之后被修改则请求成功,未被修改返回304状态码

If-None-Match

请求内容与资源ETag值不一致,相反则请求成功

If-Range

如果实体未改变,发送客户端没有的部分,否则发送整个实体

If-Unmodified-Since

只有在指定时间后未被修改才请求成功

Max-Forwards

限制信息通过代理与网关的时间

Proxy-Authorization

代理服务器要求客户端的认证信息

Range

实体字节的范围请求

Referer

浏览器对来自某一页面的内容中自动添加头部

TE

传输编码的优先级

User-Agent

Http 客户端的信息

响应首部字段

  • Age:告知客户端,源服务器在多久前创建了响应,单位是秒。自源服务器发出响应(或者验证过期缓存),到使用缓存响应发出时经过的秒数。
  • ETag:告知客户端资源实体标识,可将资源以字符串的形式做唯一标识的方式。 当资源更新时,ETag也会更新。资源被缓存时,就会分配唯一的标识,比如中文版浏览器访问谷歌就会返回中文版搜索资源,英文就返回英文搜索资源。并且ETag有强弱之分,强无论实体发生多么细微的改变,都会改变其值,而弱,只有实体发生根本的改变,才会改变其值,这时会在字段开始位置加W/。
  • Server字段是响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号。用于帮助客户端定位问题和统计数据。 Server 字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用 bug 攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息。比如 GitHub,它的 Server 字段里就看不出是使用了 Apache 还是 Nginx,只是显示为“GitHub.com”。

字段名

说明

Accept-Ranges

是否接受字节范围请求

Age

自源服务器发出响应(或者验证过期缓存),到使用缓存响应发出时经过的秒数

ETag

资源的匹配信息

Location

令客户端重定向至指定 URI

Proxy-Authenticate

代理服务器对客户端的认证信息

Retry-After

对再次发起请求的时机要求

Server

向客户端提供 Web 服务的软件名称和版本号,用于帮助客户端定位问题和统计数据

Vary

代理服务器缓存的管理信息

WWW-Authenticate

服务器对客户端认证信息

实体首部字段

字段名

说明

Allow

对某网络资源的有效的请求行为,不允许则返回405

Content-Encoding

服务器支持返回的压缩编码格式

Content-Language

实体主体语言

Content-Length

实体主体大小

Content-Location

请求资源可以替代的备用另一个地址

Content-MD5

返回资源MD5校验值

Content-Range

实体主体位置范围

Content-Type

实体主体过期类型

Expires

实体主体过期时间

Last-Modified

资源最后修改的时间

状态码

http 状态码分为五类。

  • 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
  • 2××:请求成功,报文已经收到并被正确处理;
  • 3××:资源重定向,它的位置发生变动,需要客户端重新发送请求;
  • 4××:客户端错误,请求报文有误,服务器无法处理;
  • 5××:服务器错误,服务器在处理请求时内部发生了错误;

100-199 信息性状态码

  • 100:HTTP 1.1新增,服务器告诉客户端收到了请求,请客户端继续。常用于上传大文件前使用;
  • 101:协议升级,服务器告知客户端,其(服务端)正将协议切换为请求头Update指定的协议;

200-299 成功状态码

  • 200:客户端请求成功;
  • 201:有新资源在服务器被创建;
  • 204:该状态码表示服务器已经接收到请求,但返回的响应报文不含实体主体部分,当浏览器发出请求后,返回204,表示浏览器显示的页面不发生更新;
  • 206:是 HTTP 分块下载或断点续传的基础,在客户端发送范围请求、要求获取资源的部分数据时出现,body 里的数据不是资源的全部,而是其中的一部分。并且通常还会伴随着头字段Content-Range,表示响应报文里 body 数据的具体范围,供客户端确认,比如:Content-Range: bytes 0-200/1000,表示此次获取的是总计 1000 个字节的前 200 个字节。

300-399 重定向状态码

  • 301:永久重定向,请求资源资源不存在,需要修改为新的URI才能访问;
  • 302:临时重定向,请求资源还存在,但需要临时使用另一个URI来访问;
  • 304:常用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,重定向已到缓存的文件,也就是缓存重定向。当客户端拥有可能过期的缓存,会携带etag,时间等信息询问服务器缓存是否可用,304是告诉客户端可以复用缓存;
  • 307:重定向请求必须使用原请求方法和包体发起访问;

400-499 客户端错误状态码

常见的:

  • 400 :请求报文中存在语法错误;
  • 401 :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败;
  • 403 Forbidden :请求被拒绝。如果想看说明,可以在实体主体部分对原因进行说明,用户就可以看到;
  • 404 Not Found:表示服务器上,无法找到请求的资源,也可以用来服务器拒绝请求,且不想说明理由时使用;

不常见的:

  • 405 Method Not Allowed:不允许使用某些方法操作资源,例如不允许 POST 只能 GET;
  • 406 Not Acceptable:资源无法满足客户端请求的条件,例如请求中文但只有英文;
  • 408 Request Timeout:请求超时,服务器等待了过长的时间;
  • 409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;
  • 412:在 HTTP 协议中,响应状态码 412 Precondition Failed(先决条件失败)表示客户端错误,意味着对于目标资源的访问请求被拒绝。这通常发生于采用除 GET 和 HEAD 之外的方法进行条件请求时,由首部字段 If-Unmodified-Since 或 If-None-Match 规定的先决条件不成立的情况下;
  • 413 Request Entity Too Large:请求报文里的 body 太大;
  • 414 Request-URI Too Long:请求行里的 URI 太大;
  • 416 Range Not Satisfiable :无法提供range请求中指定的那段包体;
  • 417 Expection Failed:对于Except请求头部期待的情况无法满足时的响应码;
  • 418 茶壶,触发网页反爬会返回这个状态码;
  • 426 Upgrade Required:服务器拒绝基于当前协议提供服务,通过Upgrade头部告知客户端必须升级协议才能继续处理;
  • 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;往往会发送503状态码;
  • 431 Request Header Fields Too Large:请求头某个字段或总体太大;
  • 451 Unavailable For Legal Resons:由于法律原因资源不可访问;

500-599 服务器错误状态码

  • 500 Internal Server Error :服务器正在执行请求时发生错误。有可能是web应用存在bug或某些临时性故障;
  • 501:客户端请求功能还不支持;
  • 502 Bad Gateway:服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的;
  • 503 Service Unavailable:表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码 503; 503 是一个临时的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以 503 响应报文里通常还会有一个Retry-After字段,指示客户端可以在多久以后再次尝试发送请求。
  • 504:代理服务器无法及时的从上游获取响应;
  • 505:请求使用的Http版本协议不支持;
  • 507:服务器没有足够的空间处理请求;
  • 511:代理服务器发现客户端需要进行身份验证才能获取网络访问权限;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年8月2日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 请求报文
    • 格式
      • 请求行(request line)
        • 请求头
          • 请求数据
          • 响应报文
            • 格式
              • 状态行(status line)
                • 消息报头
                  • 响应正文
                  • HTTP 首部
                    • 通用首部字段
                      • 请求首部字段
                        • 响应首部字段
                          • 实体首部字段
                          • 状态码
                            • 100-199 信息性状态码
                              • 200-299 成功状态码
                                • 300-399 重定向状态码
                                  • 400-499 客户端错误状态码
                                    • 500-599 服务器错误状态码
                                    相关产品与服务
                                    多因子身份认证
                                    多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档