【通用】超文本传输协议 (HTTP/1.1):语义和内容
    原文地址:[RFC7231]
    摘要
    超文本传输协议(HTTP)是一种无状态的,用于分布式的、协作的超文本信息系统的应用层协议。本文档定义了HTTP/1.1消息的语义,如请求方法、请求报头字段、响应状态码和响应报头字段,以及消息的有效负载(元数据和正文内容)和内容定义机制。

    1、简介
    每个超文本传输协议(HTTP)消息要么是请求,要么是响应。 服务器在连接上侦听请求,解析接收到的每个消息,根据预定义的请求目标解释消息语义 ,并使用一个或多个响应消息响应该请求。 客户端构造请求消息来传达特定的意图,检查接收到的响应以查看意图是否被执行,并决定如何解释结果。 本文档根据[RFC7230]中定义的体系结构定义了HTTP/1.1的请求和响应的语义。
    无论资源的类型、性质或实现如何,HTTP通过表现形式的处理和传输(第3节),提供了与资源交互的统一接口(第2节)。
    HTTP语义包括每个了请求方法定义的意图(章节4),这些语义的扩展,可能在请求报头字段中描述(章节5),状态码的含义,表示一个机器可读的响应(章节6), 以及可能在响应报头字段中给出的其他控制数据和资源元数据的含义(章节7)。
    本文档还定义了表示元数据用于描述接收者如何解释有效负载、可能影响内容选择的请求报头字段,以及统称为“内容定义”的各种选择算法(章节3.4)。
    1.1、一致性和错误处理
    此文档中的关键字”MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”,”SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 和 “OPTIONAL”的描述见[RFC2119]
    关于错误处理的一致性标准和注意事项在[RFC7230]章节2.5中定义。
    1.2、语法符号
    该规范使用[RFC5234]中的增强巴克斯-诺尔形式(Augmented Backus-Naur Form, ABNF)表示法和
    定义在[RFC7230]中第7节的扩展列表,允许使用’#’操作符简化逗号分隔列表的定义(类似于’‘操作符表示重复)。附录C描述了从其他文档导入的规则。附录D列举了所有将列表操作符扩展为标准ABNF表示法后的语法。
    该规范使用了在[RFC6365]中定义的术语”character”, “character encoding scheme”, “charset”, 和 “protocol element”。
    2、资源(Resources)
    HTTP请求的目标称为“资源”。HTTP不限制资源的性质;它仅仅定义了一个可以用来与资源交互的接口。每个资源由统一资源标识符(Uniform resource Identifier, URI)来定义,如[RFC7230]章节2.7所述。
    当客户端构造HTTP/1.1请求消息时,它会以[RFC7230]章节5.3所定义的形式之一发送到目标URI。当收到请求时,服务器将为目标资源重建一个有效的请求URI ([RFC7230]章节5.5)。
    HTTP的一个设计目标是通过在请求方法(章节4)和一些可修改的请求报文头字段(章节5)中赋予请求语义,将资源标识与请求的语义分隔开来。如果方法语义和URI本身隐含的任何语义之间存在冲突,如4.2.1节所述,方法语义优先。
    3、表现形式(Representations)
    考虑到资源可以是任何东西,并且HTTP提供的统一接口类似于一个窗口,通过这个窗口另一个独立参与者只能通过消息通信进行观察和处理, 在我们的通信过程中,需要一个抽象来表示(“代替”)当前或未来的状态。 这种抽象被称为[REST]
    为了达到HTTP的目的,“表现形式”是用来反映给定资源过去、现在或期望状态的信息,以一种包含一组表现形式的元数据和可能是无限的表现形式数据流的格式,很容易地进行协议通信。
    源服务器可以提供或能够生成多个表现形式,每个形式都是为了反映目标资源的当前状态。 在这种情况下,源服务器通常基于内容定义,使用一些算法来选择最适用于给定请求的表现形式。这个“被选择的表现形式”用来为符合条件的请求[RFC7232]提供数据和元数据,并构造200 (OK)和304(未修改)响应的有效负载到GET(章节4.3.1)。
    *3.1、表现形式的元数据

    表现形式的报文头字段提供了关于表现形式的元数据。当消息包含有效负载体时,表现形式的报文头字段描述如何解释包含在有效负载体中的表现形式数据。 在HEAD请求的响应中,表现形式的报文头字段描述了相同的GET请求有效负载体中的表示数据。
    以下报头字段代表的表现形式的元数据:

    Header Field Name Defined in
    Content-Type 章节3.1.1.5
    Content-Encoding 章节3.1.2.2
    Content-Language 章节3.1.3.2
    Content-Location 章节3.1.4.2

    3.1.1、处理表现形式数据
    3.1.1.1、媒体类型(Media Type)
    HTTP在Content-Type(章节3.1.1.5)和Accept(章节5.3.2)报文头字段中使用互联网媒体类[RFC2046],以提供开放和可扩展的数据类型和类型定义。 媒体类型定义了一种数据格式和各种处理模型:如何根据每个上下文来处理接收到的数据。

    Ada
    media-type = type “/“ subtype *( OWS “;” OWS parameter )
    type = token
    subtype = token

    type/subtype后面可以跟随 name=value(键值对)格式的参数。

    C++
    parameter = token “=” ( token / quoted-string )