PSR-7、PSR-17和PSR-18的引入都是计划的一部分,以使
构建需要以与 HTTP 客户端无关的方式向服务器发送 HTTP 请求的应用程序
我一直在使用许多过去严重依赖 Guzzle 而不是抽象接口的应用程序。这些应用程序中的大多数使用包含 JSON 正文的 GET 或 POST 请求发出简单的 API 请求,响应也包含 JSON 正文或抛出 HTTP 4xx 或 5xx 错误的异常。
这个问题来自最近的一个项目,我尝试开发一个 API 包,该包没有明确依赖 Guzzle,而是仅依赖于 PSR 接口。
这个想法是创建一个ApiWrapper
可以使用以下方法启动的类:
满足 PSR-18的HTTP 客户端ClientInterface
满足 PSR-17的请求工厂RequestFactoryInterface
满足 PSR-17的流工厂StreamFactoryInterface
这个类将有它需要的任何东西:
使用请求工厂和流工厂发出请求 (PSR-7)
使用HTTP 客户端发送请求
处理响应 - 因为我们知道这将满足 PSR-7ResponseInterface
这样的 API 包装器不依赖于上述接口的任何具体实现,而只需要这些接口的任何实现。因此,开发人员将能够使用他或她最喜欢的 HTTP 客户端,而不是被迫使用像 Guzzle 这样的特定客户端。
现在,首先,我真的很喜欢 Guzzle,这不是一篇文章来质疑 Guzzle 的厉害之处,这只是一篇询问如何让开发人员能够根据自己的需要选择正确的 http 客户端的文章。
但问题是显式依赖 Guzzle 提供了很多不错的功能,因为 Guzzle 所做的比上述更多。Guzzle 还应用了一系列处理程序和中间件,例如跟踪重定向或为 HTTP 4xx 响应引发异常。
描述很长,但问题来了:如何处理常见的 HTTP 请求处理,例如以受控方式跟踪重定向或抛出 HTTP 4xx 响应的异常(因此无论使用何种 HTTP 客户端都会产生相同的响应),而无需准确指定使用什么 HTTP 客户端?
隔江千里