PSR-7 HTTP消息接口建议

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

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

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

HTTP消息概述

每个HTTP请求消息都要遵循下列的格式:

POST /path HTTP/1.1
Host: example.com

foo=bar&baz=bat
1
2
3
4

第一行是“请求行”,并按顺序包含:

  • HTTP请求方法
  • 请求目标(通常是绝对URI或Web服务器上的路径)
  • HTTP协议版本

一个或多个HTTP标头 一个空行 消息体

每个HTTP相应消息都要遵循下列的格式:

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

This is the response body
1
2
3
4

第一行是“状态行”,按顺序包含

  • HTTP协议版本
  • HTTP状态代码
  • “原因短语”,即人类可读的状态代码描述(OK)

一个或多个HTTP标头 (Content-Type: text/plain) 一个空行 消息体

接口建议详情

本文档使用类似树形的列表结构来描述接口之间的继承关系,仅仅出于个人习惯,而不是出自官方

请务必牢记,本文档内容是实现的建议, 而不是说必须这么做,因为任何开发人员都可以选择不采用PSR

1:消息接口 Message

  • Psr\Http\Message\MessageInterface
    • Psr\Http\Message\RequestInterface // 请求消息接口
    • Psr\Http\Message\ResponseInterface // 响应消息接口

从这里开始,当引用上述接口时,将省略名称空间

2:消息头

2.1 大小写不敏感的消息头部字段名

/**
 * @var /Psr\Http\Message\RequestInterface $message
 */
$message = $message->withHeader('foo', 'bar'); // 设置头部字段的名字和值

echo $message->getHeaderLine('foo');
// 输出结果: bar

echo $message->getHeaderLine('FOO');
// 输出结果: bar

$message = $message->withHeader('fOO', 'baz');
echo $message->getHeaderLine('foo');
// 输出结果: baz
1
2
3
4
5
6
7
8
9
10
11
12
13
14

尽管获取header中的字段值时,是不区分字段名大小写的,但是,字段名原始的大小写必须要在header中原样保存,特别是调用getHeaders()方法 保留字段名的本来的大小写是一个好习惯

2.2 头部字段的值可以携带多个值(数组)

/**
 * @var /Psr\Http\Message\RequestInterface $message
 */
 $message = $message
    ->withHeader('foo', 'bar')
    ->withAddedHeader('foo', 'baz');
// 用头部字段 foo 携带两个值 bar 和 baz

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

$header = $message->getHeader('foo');
// $header的值:['bar', 'baz']
1
2
3
4
5
6
7
8
9
10
11
12
13

由于并非所有的头部字段的值都可以利用逗号作为分隔符,把多个值串联起来,比如 Set-Cookie。 因此 MessageInterface 的实现类, 应该依赖于getHeader()方法来获取携带了多个值的字段

建议书解读与应用