PHP规范PSR7(HTTP消息接口)介绍(一)

本文档描述了RFC 7230和RFC 7231中描述的用于表示HTTP消息的公共接口,以及RFC 3986中描述的用于HTTP消息的URI。

HTTP消息是Web开发的基础。 Web浏览器和HTTP客户端(如cURL)创建发送到Web服务器的HTTP请求消息,Web服务器提供HTTP响应消息。服务器端代码接收HTTP请求消息,并返回HTTP响应消息。

HTTP消息通常是从最终用户消费者中抽象出来的,但作为开发人员,我们通常需要知道它们的结构以及如何访问或操作它们以执行我们的任务,无论是否可能向HTTP API发出请求,或处理传入的请求。

每条HTTP请求消息都有一个特定的形式:

POST /path HTTP/1.1
Host: example.com

foo=bar&baz=bat

请求的第一行是“请求行”,并按顺序包含HTTP请求方法,请求目标(通常是绝对URI或Web服务器上的路径)以及HTTP协议版本。接下来是一个或多个HTTP标头,一个空行和消息正文。

HTTP响应消息具有类似的结构:

HTTP/1.1 200 OK
Content-Type: text/plain

This is the response body

 第一行是“状态行”,并按顺序包含HTTP协议版本,HTTP状态代码和“原因短语”,即人类可读的状态代码描述。与请求消息类似,然后是一个或多个HTTP标头,空行和消息正文。

本文档中描述的接口是围绕HTTP消息的抽象和构成它们的元素。

本文档中的关键词“必须”,“必须”,“必需”,“应该”,“不应该”,“应该”,“不应该”,“推荐”,“可以”和“可选”按照RFC 2119中的描述进行解释。

1 简介

1.1 消息

HTTP消息是从客户端到服务器的请求或从服务器到客户端的响应。该规范分别定义了HTTP消息Psr \ Http \ Message \ RequestInterface和Psr \ Http \ Message \ ResponseInterface的接口。

Psr \ Http \ Message \ RequestInterface和Psr \ Http \ Message \ ResponseInterface都扩展了Psr \ Http \ Message \ MessageInterface。虽然Psr \ Http \ Message \ MessageInterface可以直接实现,但实现者应该实现Psr \ Http \ Message \ RequestInterface和Psr \ Http \ Message \ ResponseInterface。

从这里开始,当引用这些接口时,将省略命名空间Psr \ Http \ Message。

1.2 HTTP头部

不区分大小写的标头字段名称

HTTP消息包括不区分大小写的头字段名称。通过名称从实现MessageInterface的类中以不区分大小写的方式检索标头。例如,检索foo标头将返回与检索FoO标头相同的结果。同样,设置Foo标头将覆盖任何先前设置的foo标头值。

$message = $message->withHeader('foo', 'bar');

echo $message->getHeaderLine('foo');
// Outputs: bar

echo $message->getHeaderLine('FOO');
// Outputs: bar

$message = $message->withHeader('fOO', 'baz');
echo $message->getHeaderLine('foo');
// Outputs: baz

尽管可以不区分大小写地检索标题,但是原始情况必须由实现保留,特别是在使用getHeaders()检索时。

不符合要求的HTTP应用程序可能取决于某种情况,因此在创建请求或响应时,用户能够指示HTTP标头的大小写是有用的。

具有多个值的标头

为了容纳具有多个值的标头,但仍然提供了将标头作为字符串使用的便利,可以从MessageInterface的实例中将标头检索为数组或字符串。使用getHeaderLine()方法将标头值检索为包含不区分大小写标头的所有标头值的字符串,其名称与逗号连接。使用getHeader()按名称检索特定于不区分大小写的标头的所有标头值的数组。

$message = $message
    ->withHeader('foo', 'bar')
    ->withAddedHeader('foo', 'baz');

$header = $message->getHeaderLine('foo');
// $header contains: 'bar, baz'

$header = $message->getHeader('foo');
// ['bar', 'baz']

注意:并非所有标头值都可以使用逗号(例如,Set-Cookie)连接。使用这样的头时,基于MessageInterface的类的使用者应该依赖于getHeader()方法来检索这样的多值头。

主机头

在请求中,Host头通常镜像URI的主机组件,以及建立TCP连接时使用的主机。但是,HTTP规范允许Host标头与两者中的每一个都不同。

在构造期间,如果没有提供Host头,则实现必须尝试从提供的URI设置Host头。

默认情况下,RequestInterface :: withUri()将使用与传递的UriInterface的主机组件匹配的Host头替换返回的请求的Host头。

您可以通过为第二个($ preserveHost)参数传递true来选择保留Host头的原始状态。当此参数设置为true时,返回的请求将不会更新返回消息的Host标头 - 除非消息不包含Host标头。

此表说明了getHeaderLine('Host')将为withUri()返回的请求返回的内容,其中$ preserveHost参数设置为true,用于各种初始请求和URI。

REQUEST HOST HEADER1 REQUEST HOST COMPONENT2 URI HOST COMPONENT3 RESULT
’’ ’’ ’’ ’’
’’ foo.com ’’ foo.com
’’ foo.com bar.com foo.com
foo.com ’’ bar.com foo.com
foo.com bar.com baz.com foo.com
  • 操作前的主机头值。
  • 操作前请求中组成的URI的主机组件。
  • 通过withUri()注入的URI的主机组件。

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/83479499