PSR 15 HTTP 请求处理
本文档定义了用于处理 HTTP 消息的 HTTP 请求处理程序 ( 「请求处理程序」 ) 和 HTTP 中间件组件 (「中间件」 ) 的通用接口
这里的 HTTP 消息必须遵许 PSR 7 或后续替换 PSR 规范
HTTP 请求处理程序是任意 Web 应用程序的基本组成部分: 服务器端代码接收请求消息,对其进行处理,并生成响应消息
HTTP 中间件是将请求和响应处理从应用程序层剥离的一种将常见的方式
本规范中描述的接口是对请求处理程序和中间件的抽象
注意: 本规范提及的「请求处理程序」和 「中间件」 限定于处理 HTTP 服务请求
本文中的 必须,不得,需要,应,不应,应该,不应该,推荐,可能 和 可选 等词按照 RFC 2119 中的描述进行解释
1. 规范
1.1 请求处理程序
请求处理程序是一个单独的组件,像 PSR 7 所定义的那样处理请求并生成响应
如果传入的请求不足以生成响应,请求处理程序 可以 抛出异常,我们不会限定异常的类型
遵循此规范的请求处理程序 必须 实现下面的接口
Psr\Http\Server\RequestHandlerInterface
1.2 中间件
中间件组件是一个独立组件,通常与其它中间件组件一起参与处理传入的遵循 PSR 7 规范的请求并生成遵循 PSR 7 规范的响应
如果满足适当的条件,中间件组件可以直接生成并返回响应而不用委托给请求处理程序
遵循此规范的中间件 必须 实现下面的接口
Psr\Http\Server\MiddlewareInterface
1.3 生成响应
建议任何可能生成响应的中间件或请求处理程序要么创建一个实现了 PSR 7 ResponseInterface
的类的实例,要么返回一个能够能够生成 ResponseInterface
实例的工厂方法,以防止依赖于特定的 HTTP 消息实现
1.4 处理异常
一种推荐的做法是任何应用程序都使用一个包含了捕获异常并将其转换为响应的组件的中间件
这个中间件 应该 是第一个被执行的组件,并且包含所有进一步的处理以确保始终生成响应
2. 接口
2.1 Psr\Http\Server\RequestHandlerInterface
请求处理程序 必须 实现下面的接口
<?php namespace Psr\Http\Server; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; /** * 处理一个服务请求并生成响应 * * HTTP 请求处理程序处理一个 HTTP 请求并生成一个 HTTP 响应 * */ interface RequestHandlerInterface { /** * 处理一个请求,并生成一个响应 * * 可以调用其它协作的代码来生成响应 */ public function handle(ServerRequestInterface $request): ResponseInterface; }
2.2 Psr\Http\Server\MiddlewareInterface
中间件组件 必须 实现下面的接口
<?php namespace Psr\Http\Server; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; /** * 处理服务请求和响应 * * HTTP 中间件组件参与处理 HTTP 消息: * 通过对请求进行处理,生成响应或将请求转发给后续中间件 */ interface MiddlewareInterface { /** * 处理传入的服务请求 * * 处理传入的服务请求并生成响应 * 如果没有生成响应,可以委托请求处理程序来执行此操作 */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface; }