美文网首页我爱编程
http权威指南第三章

http权威指南第三章

作者: shenyifu | 来源:发表于2016-09-09 08:18 被阅读44次

    http报文

    重点:

    • 报文是如何流动的;
    • http报文的三个组成部分(起始行、首部、和实体的主体部分);
    • 请求和响应之间的区别;
    • 请求报文支持的各种功能;
    • 和请求报文一起返回的各种状态码;
    • 各种各样的http首部都是用来做什么的;

    报文流

    http报文是在http应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息报文描述了报文的内容及含义,后面跟着可选数据部分。这些报文在客户端、服务器和代理之间流动。术语 流入 流出 上游 下游 都是用来描述报文方向的。

    3.11报文流入源端服务器

    http使用流入(inbound)和流出(outbound)来描述事务处理(transation)的方向。客户端发向服务器为流入,服务器发向客户端称为流出。

    3.1.2报文向下游流动

    http会像河水一样流动。不管是请求报文还是响应报文,所有的报文都会向下游(downstream)流动。所有报文发送者都在接受者的上游(upstream)。

    3.2报文的组成部分

    http报文是简单的格式化数据块。每条报文都包含三个部分:对报文描述的起始行(start line),包含属性的首部(header)块,以及可选的,包含数据主体(body)部分。

    起始行和首部就是由行分隔的ascll文本。每行以回车换行符结束。主体是一个可选的数据块。与起始行不同的是,主体可以包含文本或二进制数据,也可以为空。

    3.2.1报文的语法

    所有的http报文可以分为两类:请求报文(request message)和响应报文(response message)请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。

    请求报文格式

    <method><request-url><version>
    <headers>

    <entity-body>
    响应报文格式
    <version><status><reason-phrase>
    <headers>

    <entity-body>

    • 方法(method)
      客户端希望服务器对资源执行的动作。是一个单独的词,比如get post
    • 请求url(request url)
      命名了所请求资源,或者url路径组件的完整url。如果直接与服务器进行对话,只要url的路径组件是资源的绝对路径,通常不会有问题。
    • 版本(version)
      报文所使用的http版本,其格式为:http/<major>.<minor>,其中主要版本号(major)和次要版本号(minor)都是整数
    • 状态码(status-code)
      这三个数字描述了请求过程中发生的情况。每个状态码的第一位数字用于描述状态的一般类别(成功、出错等)
    • 原因短语(reason-phrase)
      数字状态码的可读版本,包含行中止之前的所有文本。
    • 首部(header)
      可以有零个或多个首部,每个首部包含一个名字,后面跟着一个冒号,然后一个可选空格,接着是一个值,最后是crlf。首部是一个crlf结束的,有些http版本需要包含特定的首部
    • 实体的主体部分
      包含一个有任意数据组成的数据块。

    3.2.2起始行

    所有的http报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么,响应报文起始行说明发生了什么。

    1.请求行
    请求报文请求服务器对资源进行一些操作。请求报文的起始行,或者称为请求行,包含了一个方法和一个请求url,这个方法描述了服务器应该执行的操作,url描述了要对那个资源执行这个方法。请求行还包含http版本,在http1.0以前不要求请求行包含http版本号。

    2.响应行

    响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或者称为响应行,包含类响应报文的http版本。数字状态码,以及描述操作状态的文本形式的原因短语。

    3.方法

    请求的起始行以方法作为开始,方法用来告知服务器要做些什么。

    方法 描述 是否包含主体
    get 从服务器获取一份文档
    head 只从服务器获得文档的首部
    post 向服务器发送需要处理的数据
    put 将请求的主体存储在服务器上
    trace 对可能经过代理服务器的报文进行追踪
    options 决定可以在服务器执行那些方法
    delete 从服务器上删除一份文档

    4.状态码

    状态码用来告诉客户端发生了什么,状态码位于起始行的行中。

    整体范围 分类
    1xx 信息提示
    2xx 成功
    3xx 重定向
    4xx 客户端错误
    5xx 服务器错误

    5.原因短语

    响应起始行的最后一个组件,为状态码提供了一个文本解释。http没有规定原因短语以何种方式出现。

    6版本号

    版本号说明了应用程序支持的最高版本,但http1.0在解释包含http1.1的响应时,会认为这个响应是个1.1响应。

    版本号不会被当做分数处理,而是比较每个数字,http/2.22就比http/2.3高,因为22比3大。

    3.2.3首部

    1.首部分类

    • 通用首部
      既可以出现在请求报文中,也可以出现在响应报文中。
    • 请求首部
      提供更多有关请求的信息
    • 响应首部
      提供更多有关响应的信息
    • 实体首部
      描述主体的长度和内容,或者资源自身
    • 扩展首部
      规范中没有定义的新首部

    2.首部延续行

    将长的首部分为多行可以提高可读性,多出来的每一行至少要有一个空格或制表符

    3.2.4实体的主体部分

    http报文的第三部分是可选的实体主体部分。实体的主体部分是http报文的负荷,就是http要传输的内容。

    3.2.5版本0.9的报文

    http/0.9也由请求和响应组成,但请求中只包含方法和请求url,响应中只包含实体,它没有版本信息,没有状态码或原因短语,也没有首部。

    3.3方法

    不是每个服务器都实现了所有这些方法,如果一台服务器要与http1.1兼容,只要实现get、head方法就可以了。

    3.3.1安全方法

    http定义了一组被称为安全方法的方法。get和head都被认为是安全的方法,这就意味着使用get或head方法的http请求不会产生什么动作,安全方法不一定什么都不执行的(这将由web开发者决定)

    3.3.2get

    get是最常用的方法。通常用于请求服务器发送某个资源。

    3.3.3head

    head与get方法很相似,但服务器只返回首部。不会返回实体的主体部分。这就允许客户端在未获得实际资源的情况下对资源的首部进行检查。

    3.3.4put

    与get从服务器读取文档相反,普通方法会向服务器写入文档。有些发布系统允许用户创建web页面,并用普通直接安装到服务器上

    put方法的语义就是让服务器用请求的主体部分来创建一个由所请求的url命名的新文档,或者如果url已存在,就用主体来替代它

    3.3.5post

    post起初是用来向服务器输入数据的。实际上用它来支持html的表单。

    3.3.6trace

    客户端发起一个请求这个请求可能要穿过防火墙、代理、网关或其它一些程序。每个中间结点都有可能修改原始http请求。trace方法允许客户端在最终请求发送给服务器时看看它变成什么样子。

    trace请求会在目的服务器发起一个回环诊断。行程最后一站的服务器会弹回一条trace响应,并在响应主体中携带它收到的原始请求报文。

    3.3.7options

    options方法请求web服务器告知其支持的功能。可以查询服务器通常支持那些方法。

    3.3.8delete

    delete就是请求服务器删除所请求的资源。但是客户端应用无法保证删除一定会被执行。用为http协议允许服务器在不通知客户端的情况下撤销请求。

    http被设计成字段可扩展的,这样新特性就不会使老软件失效了。服务器会为他所管理的资源实现http服务,这些方法为开发者提供了扩展http服务能力的手段。

    方法 描述
    lock 允许用户锁定资源,比如正在编辑
    mkcol 允许别人创建资源
    copy 便于在服务器复制资源
    move 在服务器移动资源

    并不是所有的方法都是正式规范中定义的,如果你定义了一个扩展方法,很可能大部分http应用程序都无法理解。同样你的http应用程序也有可能遇到一些其它应用程序正在使用,而并不理解的方法。

    3.4状态码

    多而杂,不抄了

    3.5首部

    3.5.1通用首部

    有些首部提供了与报文相关的基本信息,被称为通用首部。

    通用信息性首部

    首部 描述
    connection 允许客户端和服务器指定与请求/响应连接相关的选项
    date 提供日期和时间,说明报文是什么时间创建的
    mime-version 给出了发送端的mime版本
    trailer 如果报文采用了分块传输编码(chunked transfer encoding)方式就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合
    update 给出了发送端可能想要升级使用的新版本或协议
    via 显示报文经过的中间结点

    通用缓存首部

    http1.0引入了第一个允许http应用缓存对象本地副本的首部,这样就不用总是从源服务器获取了。

    首部 描述
    cache-control 用于报文传送缓存指示
    pragma 另一种报文传送指示的方式,但并不用于缓存

    3.5.2请求首部

    请求首部是只在请求报文中有意义的首部。

    请求的信息性首部

    首部 描述
    client-ip 提供了客户端的ip地址
    from 提供了客户端的mail地址
    host 给出了服务器的主机名和端口号
    referer 提供了包含当前请求uri的文档的url
    ua-color 提供了客户端显示器颜色相关的信息
    ua-cpu 客户端的cpu类型或制造商
    ua——disp 提供了显示器能力相关的信息
    ua-os 客户端的操作系统名称和版本
    ua-pixels 客户端的像素信息
    user-agent 发起请求的程序名称

    1.accept首部

    accept将客户端的喜好和能力告知服务器的方式

    首部 描述
    accept 告诉服务器能够发送哪些媒体类型
    accept-charset 哪些字符集
    accept-encoding 哪些编码方式
    accept-language 哪些语言
    te 哪些扩展传输编码

    2.条件请求首部

    客户端为请求添加限制。

    首部 描述
    expect 允许客户端列出请求所要求的服务器行为
    if-match 如果实体标记与文档当前的标记相同就获取这份文档
    if-modified-since 除非在日期后修改过,否则限制该请求
    if-none-match 如果文档的标记与实体标记不符,获取该文档
    if-range 允许对文档的某个范围进行条件请求
    if-unmodified-since 除非在某个日期后没有修改过,否则限制该请求
    range 如果服务器支持范围请求,就请求资源的指定范围

    3.安全请求首部

    http本身支持一种简单的机制,可以对请求进行质询/响应认证。这种机制要求,在获取资源之前,先对自身进行认证,这样使事务稍微安全一些。

    首部 描述
    authorization 包含了客户端提供给服务器,以便对自身进行认证的数据
    cookie 客户端用它向服务器传送一个令牌,它并不是真正的安全首部,但隐含了安全功能
    cookie2 用来说明请求端支持的cookie版本

    安全请求首部

    首部 描述
    authorization 包含了客户端提供给服务器,以便对自身进行认证的数据
    cookie 客户端用它向服务器传送一个令牌,它并不是真正的安全首部,但隐含了安全功能
    cookie2 用来说明请求端支持的cookie版本

    4.请求代理首部

    首部 描述
    max-forward 在通往源服务器的路径上,将请求转发给其它代理或网关的最大次数-与trace方法一起使用。
    proxy-authorization 与authorization首部相同,但这个首部是在与代理认证时使用的
    proxy-connection 与connection相同,但这个首部是在与代理认证时使用的

    3.5.3响应首部

    响应报文有自己的响应首部集。响应首部为客户端提供了一些额外的信息。

    首部 描述
    age 从最初创建开始的持续响应时间
    public 服务器为资源提供的请求方法列表
    retry-after 如果资源不可用,在此日期之后重试
    server服务器应用程序的名称和版本
    title 对html文档来说,就是html文档的标题
    warning 比原因短语中更详细的警告报文

    1.协商首部

    如果资源有多种便是方法,http1.1可以为客户端和服务器提供对资源进行协商的能力

    首部 描述
    accept-ranges 对此资源来说服务器可接受的范围类型
    vary 服务器查看的其它首部的列表,可能会使响应发生变化

    2.安全响应首部

    首部 描述
    proxy-authenticate 来自代理的对客户端的质询列表
    set-cookie 不是真正的安全首部,但隐含安全功能,可以在客户端设置一个令牌,以方便服务器对客户端的标示
    set-cookie2 与set-cookie类似
    www-authenticate 来自服务器对客户端的质询列表

    3.5.4实体首部

    信息性首部

    首部 描述
    allow 列出了可以对实体执行的请求方法
    location 告知客户端实际上位于何处

    1.内容首部

    首部 描述
    content-base 解析主体的相对url时使用的基础url
    content-encoding 对主体执行的任意编码方式
    content-language 理解主体是最适宜使用的自然语言
    content-length 主体的长度或尺寸
    content-location 资源实际所在的位置
    content-md5 主体的md5校验和
    content-range 在整个资源中此实体表示的字节范围
    content-type 主体的对象类型

    2.实体缓存首部

    通用的缓存首部说明了如何或什么时候进行缓存。实体的缓存提供了与被缓存实体有关的信息。

    实体缓存

    首部 描述
    etag 榆次实体相关的实体标记
    expires 实体不在有效,要从源端再次获取次实体的日期和时间
    last-modified 这个实体最后一次被修改的日期和时间

    相关文章

      网友评论

        本文标题:http权威指南第三章

        本文链接:https://www.haomeiwen.com/subject/tadjettx.html