Hyper中的 Request和Response
常见的Request和Response
请求相关
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ServerRequestInterface;
use Hyperf\HttpMessage\Base\Request;
use Hyperf\HttpMessage\Server\Request;
use Hyperf\HttpServer\Contract\RequestInterface ;
use Hyperf\HttpServer\Request;
use Swoole\Http\Request;
use Swoole\Http2\Request;
响应相关
use Psr\Http\Message\ResponseInterface;
use Hyperf\HttpMessage\Base\Response;
use Hyperf\HttpMessage\Server\Response;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Hyperf\HttpServer\Response;
use Swoole\Http\Response;
use Swoole\Http2\Response;
其中
use Swoole\Http\Request;
use Swoole\Http2\Request;
use Swoole\Http\Response;
use Swoole\Http2\Response;
是Swoole提供的请求响应对象,主要是为Hyperf构建标准的PSR7 Request和Response对象提供元数据,我们不多做解释,平时框架里不直接使用
请求
Psr\Http\Message\RequestInterface和Psr\Http\Message\ServerRequestInterface
这两个接口是PSR7协议定义的关于HTTP消息对象的一些推荐规范的接口
ServerRequestInterface 是 RequestInterface 的一个子接口
RequestInterface是抽象概念上的请求接口
ServerRequestInterface是专属于服务端的请求接口
Hyperf 的请求对象是基于PSR7实现的,也就是说hyperf里的Request对象都是
ServerRequestInterface和RequestInterface的实现类
(Hyperf\HttpMessage\Base\Request 和 Hyperf\HttpMessage\Server\Request)
Hyperf\HttpMessage\Base\Request和Hyperf\HttpMessage\Server\Request
Hyperf\HttpMessage\Base\Request是Psr\Http\Message\RequestInterface的实现
Hyperf\HttpMessage\Server\Request 是 Psr\Http\Message\ServerRequestInterface的实现
也就是说Hyperf\HttpServer\Request是由Hyperf\HttpMessage\Base\Request构建来的
Hyperf\HttpServer\Contract\RequestInterface和Hyperf\HttpServer\Request
Hyperf\HttpServer\Request是Hyperf\HttpServer\Contract\RequestInterface的实现类
Hyperf是一个协程框架,而Hyperf里面DI容器管理的对象都是长生命周期的对象。
假设我们再Hyperf里的一个Controller里使用了一个Request对象,而一个Request对象他跟随的就是一个请求。
一个请求就是一个协程,而这个Controller是会在多个协程之间来回切换混着使用的。
所以假设我们将一个Request对象绑定在这个Controller的一个成员属性上,就非常容易出现协程间数据混淆的问题。
因此Hyperf提供了Hyperf\HttpServer\Contract\RequestInterface,其目的在于保持在Controller的成员属性上
直接Inject注入的这种用法同时又不会导致协程间的数据混淆。
实现方式:
Hyperf\HttpServer\Request核心代码
public function query(?string $key = null, $default = null) { if ($key === null) { return $this->getQueryParams(); } return data_get($this->getQueryParams(), $key, $default); } public function getQueryParams() { return $this->call(__FUNCTION__, func_get_args()); } protected function call($name, $arguments) { $request = $this->getRequest(); if (! method_exists($request, $name)) { throw new \RuntimeException('Method not exist.'); } return $request->{$name}(...$arguments); } protected function getRequest(): ServerRequestInterface { return Context::get(ServerRequestInterface::class); }
getRequest()方法返回的 Request对象是一个代理类,它代理的是ServerRequestInterface的储存对象也就是Hyperf\HttpServer\Request对象
响应
Psr\Http\Message\ResponseInterface
PSR7约束的响应接口
Hyperf\HttpMessage\Base\Response
基于PSR7约束实现的响应对象,里面包含了Response的标准实现
Hyperf\HttpMessage\Server\Response
是Hyperf\HttpMessage\Base\Response的一个子类
其中Hyperf\HttpMessage\Server\Response 下的send方法
将当前构建好的Response对象通过Swoole的Response对象将这些内容返回给这个请求
换句话说Hyperf\HttpMessage\Server\Response,就是Swoole\Http\Response与Hyperf\HttpMessage\Base\Response的一个桥接,来完成这个请求的响应
类似于Hyperf\HttpMessage\Server\Request 也是从协程上下文中获取对应的响应对象,并做相关的操作
Hyperf\HttpMessage\Server\Response处理提供PSR7约束的方法之外,还提供了一些日常开发中常用的结果响应的方法
Hyperf\HttpServer\Contract\ResponseInterface
请求的代理类
Hyperf\HttpServer\Response
Hyperf\HttpServer\Contract\ResponseInterface的实现
实现方式类似
总结
存储在协程上下文中的请求对象的key是Psr\Http\Message\ServerRequestInterface
对应的储存在协程上下文中的对象是Hyperf\HttpMessage\Server\Request
在日常开发中使用的,注入的是Hyperf\HttpServer\Contract\RequestInterface接口类
Hyperf\HttpServer\Contract\RequestInterface实际的代理对象就是Hyperf\HttpServer\Request
响应相关类似请求