问题标签 [psr-7]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
745 浏览

php - 在自定义路由器 PHP 中匹配 URL 上的参数

我正在向这个自定义路由器和自定义请求类添加一个功能,以便能够提供页面和 json 响应。

我被困在路由器部分,其中 Route 在 url 中有一个参数,例如:

example.com/apply/{变量}

这些是类:

路由器类:

请求类:

这就是我如何调用路由器:

哪种方法会更好?我不知道如何解决。

0 投票
0 回答
820 浏览

php - 将 PSR-7 流写入文件

我正在构建一个通读图像缓存,并且正在寻找一种将 PSR-7 流写入服务器上文件的方法。文档并不清楚如何执行此操作(它主要侧重于提供文件,而不是编写文件)。

我目前的最大努力使用$stream->detach()的并不理想(因为它破坏了基础流,然后我无法将其返回给用户)。有一个更好的方法吗?

抢占所有“你为什么这样做”的问题;我从远程服务获取这些图像。该服务的条款要求我在本地缓存图像。

0 投票
0 回答
487 浏览

php - 如何从 PSR-7 UploadedFileInterface 检测 MIME 类型

我有一个简单的控制器来处理图像上传。在将图像/文件保存到最终目的地之前,我想验证该文件的 mimeType。

我的控制器使用Psr\Http\Message\ServerRequestInterface并调用getUploadedFiles()将上传的文件作为Psr\Http\Message\UploadedFileInterface.

在该接口的一个实例上,我现在可以调用getClientMediaType()以获取 mime 类型。

我的问题是文档明确声明不信任该值!因此,我想检测 mimeTypemime_content_type()但我无法从该界面获取实际文件名。

我看到两个选项:

  • 我可以只使用 $_FILES 并调用 mime_content_type($_FILES['files']['tmp_name'])
  • 我可以将文件移动到我知道的地方,然后调用 mime_content_type() 但这会破坏在验证之前不移动文件的目的

这是我的控制器的缩写版本:

关于如何从 UploadedFileInterface 获取 tmp_name 有没有我没有看到的方法?是否有另一种最佳实践来进行这种验证?这似乎是一个非常明显的问题,所以我想我缺少一些基本的东西。

0 投票
1 回答
268 浏览

php - 在 PSR-7 响应中解析巨大的 XML

我想在 PSR-7 响应中解析巨大的 xml。Defaults XmlReader 看起来不错,但似乎不能使用 PSR-7 StreamInterface。

我的 XML 看起来:

我想使用类似的东西:

任何想法如何实现这一目标?

0 投票
3 回答
4081 浏览

php - 如何从 Slim 4 中间件进行重定向?

我一直在测试新的 Slim 4 框架,并且重定向在普通类中对我来说工作正常,但我似乎无法让它们在中间件中工作,其中响应是由请求处理程序动态生成的(显然?)。当我尝试使用 Location 标头重定向时,它根本无法重定向,并且我的路线继续到原始位置。

这是我用于测试的身份验证中间件的基本版本:

有没有人让这个工作?如果是这样,你是如何做到的?提前致谢。

0 投票
0 回答
234 浏览

php - PSR-7 请求如何工作?

我对基于 PSR-7 的请求的工作方式感到困惑。

作为 PSR-7,请求必须实现Psr\Http\Message\RequestInterface. 通过此接口,请求必须具有主体,并且必须将主体作为实现的对象返回StreamInterface

当我查看 时StreamInterface,它更多的是关于处理资源。

当我查看 laravel 或 symfony 的请求时,所有这些请求都有 server、get、post 和 cookie 参数。没有request body或类似的东西。

首先,为什么请求必须有一个主体(如响应)以及为什么请求主体必须包含资源以及如何?

0 投票
2 回答
370 浏览

php - 如何从zend expressive REST api应用程序中调用另一个内部端点?

我正在尝试从 zend expressive (PSR-7) 应用程序的另一个方法中调用 REST api 端点(内部)。目前我正在做的是,我发送另一个这样的http请求(文档):

但我想知道,由于我正在尝试调用内部端点,我能否以某种方式转发请求?我听说过控制器插件转发,但我不确定它是如何工作的。

从数据库中检索端点 url 和请求类型。我可以直接调用该方法,但转发端点会减少有条件地检查每个模块所需的工作。

感谢您能指出我正确的方向。

更新:

让我解释一下用例。我们有一个调度程序数据库,其中包含要发送的端点和参数。每 5 分钟 (CRON) 向调度程序 API 发送一个 cURL 请求。调度程序检查数据库中提供的时间间隔,并在此时间间隔触发相应的端点。

0 投票
1 回答
1227 浏览

php - 使用 PSR 7、17 和 18 而不是 Guzzle 的客户端无关 API 包装器

PSR

PSR-7PSR-17PSR-18的引入都是计划的一部分,以使

构建需要以与 HTTP 客户端无关的方式向服务器发送 HTTP 请求的应用程序

请参阅PSR-18:HTTP 客户端的 PHP 标准

我一直在使用许多过去严重依赖 Guzzle 而不是抽象接口的应用程序。这些应用程序中的大多数使用包含 JSON 正文的 GET 或 POST 请求发出简单的 API 请求,响应也包含 JSON 正文或抛出 HTTP 4xx 或 5xx 错误的异常。

API 包装器

这个问题来自最近的一个项目,我尝试开发一个 API 包,该包没有明确依赖 Guzzle,而是仅依赖于 PSR 接口。

这个想法是创建一个ApiWrapper可以使用以下方法启动的类:

  1. 满足 PSR-18的HTTP 客户端ClientInterface
  2. 满足 PSR-17的请求工厂RequestFactoryInterface
  3. 满足 PSR-17的流工厂StreamFactoryInterface

这个类将有它需要的任何东西:

  1. 使用请求工厂流工厂发出请求 (PSR-7)
  2. 使用HTTP 客户端发送请求
  3. 处理响应 - 因为我们知道这将满足 PSR-7ResponseInterface

这样的 API 包装器不依赖于上述接口的任何具体实现,而只需要这些接口的任何实现。因此,开发人员将能够使用他或她最喜欢的 HTTP 客户端,而不是被迫使用像 Guzzle 这样的特定客户端。

问题

现在,首先,我真的很喜欢 Guzzle,这不是一篇文章来质疑 Guzzle 的厉害之处,这只是一篇询问如何让开发人员能够根据自己的需要选择正确的 http 客户端的文章。

但问题是显式依赖 Guzzle 提供了很多不错的功能,因为 Guzzle 所做的比上述更多。Guzzle 还应用了一系列处理程序和中间件,例如跟踪重定​​向或为 HTTP 4xx 响应引发异常。

问题

描述很长,但问题来了:如何处理常见的 HTTP 请求处理,例如以受控方式跟踪重定向或抛出 HTTP 4xx 响应的异常(因此无论使用何种 HTTP 客户端都会产生相同的响应),而无需准确指定使用什么 HTTP 客户端?

例子

下面是一个ApiWrapper实现示例:

0 投票
1 回答
2079 浏览

php - PSR-7:getParsedBody() 与 getBody()

场景一发送x-www-form-urlencoded数据

运行print_r($request->getParsedBody());返回正常:

运行print_r($request->getBody()->getContents());返回一个字符串foo=bar


场景二发送application/json数据

运行print_r($request->getParsedBody());返回一个空数组。Array ( )

但是,运行print_r($request->getBody()->getContents());返回正常:

{"foo":"bar"}


这是预期的行为吗?

意思是,如果我们要发送x-www-form-urlencoded数据,我们应该使用getParsedBody().

getBody()->getContents()如果我们要发送,应该使用 Whileapplication/json吗?


附加信息:

请求对象是使用以下方法创建的:

0 投票
0 回答
96 浏览

php - Codeception sendPOST 不适用于 Slim 3 getParam

Codeception 相对较新,并试图将其连接到 Slim 3。为 POST 请求设置基本测试,如下所示:

在路线本身上,我使用 Slim 3 的 getParam 来获取我发送的详细信息,如下所示:

通过 --debug 运行测试,我看到请求有{"details":{"package_id":0,"order_id":0}

但是,似乎 getParam 的详细信息没有返回任何内容。我试过在细节之外单独发送它们,但无济于事。

此时,想知道我通过 Codeception 的 sendPOST 和 Slim 3 的 getParam 发送的详细信息之间是否存在 PSR-7 兼容性问题,因为 Slim 的 getParam 方法带有以下注释:

任何帮助表示赞赏!