问题标签 [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.
php - 我应该同时实现 RequestInterface 和 ServerRequestInterface
我目前正在为我的个人 PHP 框架编写HTTP 消息接口建议 (PSR-7)的实现。我已经为推荐中的每个接口编写了类。但现在我意识到我不需要对出站请求进行抽象。
目前我有:
Message
对于MessageInterface
,Request
对于RequestInterface
,Response
对于ResponseInterface
,ServerRequest
对于ServerRequestInterface
,Stream
对于StreamInterface
,UploadedFile
对于UploadedFileInterface
, 和,Uri
为UriInterface
.
我想知道我是否必须实现建议的每个接口才能声称我的框架使用它?或者我可以只实现我需要的部分吗?
php - 从资源创建流
我知道我可以使用fopen函数从文件名(真实文件名或 URL)创建PHP 流:
生成的流 ( $stream
) 是从 URL 创建的“流”类型的资源。php://temp
但是我怎样才能从资源中创建一个像上面这样的流呢?
我为什么要问这个?
我正在开发一个PSR-7库,并且我用一个类实现了 PSR-7 StreamInterface 。Stream
为了创建Stream
实例,我决定也实现一个StreamFactory
。它的接口 ,StreamFactoryInterface
是在PSR-17(HTTP 工厂)提案中定义的。
StreamFactoryInterface
定义了一个名为 的方法,该方法createStreamFromResource
- 符合其官方评论 - 应该:
从现有资源创建新流。
流必须是可读的并且可能是可写的。
所以工厂方法接收一个资源作为参数。并且,在其具体实现中,Stream
创建了一个新对象——它也接收一个资源作为参数。
这是问题所在:
为简单起见,假设Stream
该类仅适用于流,例如“流”类型的资源。如果它接收到的资源不是"stream"类型的,它会拒绝它。
那么,如果资源参数createStreamFromResource
还不是“流”类型的资源呢?如何将其转换为流,例如转换为"stream"类型的资源,以便我可以进一步将其传递给Stream
使用它创建新对象的调用?有没有办法(PHP 方法、函数或强制转换函数)来完成这项任务?
笔记:
- 为清楚起见,我准备了一个完整的示例
testStream.php
(Stream
- 我还发布了工厂接口的具体实现:
StreamFactory
带有方法的类createStreamFromResource
。调用此方法应该是我在testStream.php
. - 此外,我还介绍了类
Stream
和Response
,以便您可以根据需要直接测试所有内容。这两个类是我真实代码的一个非常简化的版本。 - 在我的代码中,我用"@asking"标记了两个提问的地方。
非常感谢您的时间和耐心!
testStream.php(测试页面)
StreamFactory 类(因为我有它,所以没有简化)
Stream 类(非常简化)
Response 类(非常简化)
php - PHP+PSR7:getParsedBody() 总是将 json 上的空字符串转换为 null
我正在使用zendframework/zend-diactoros
Laravel。当我发送 json 数据时遇到问题
然后,在控制器中
更多示例:
我发了
var_dump
我发了
var_dump
只有第一个例子有问题,但我不知道这是否正确。也许存在一种使用此 PSR7 库转储准确接收数据的方法。
amazon-web-services - AWS - Guzzle 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法
我正在使用 SignatureV4 aws 身份验证来验证我的 API 调用,我也在使用 Guzzle/Client 来调用 API。
通过遵循上述这些,我的 API 调用仅适用于 GET 方法,不适用于 POST 方法。对于 POST 方法调用它显示错误(我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法)
我的代码:
php - $_FILES 键用于构建 PSR-7 上传文件列表
简短版本:
当用户使用表单上传文件时,会在全局变量中保存一个数组$_FILES
。例如,当使用:
全局变量如下所示:
原则上,我需要知道数组的哪些键$_FILES['myfiles0']
始终存在并且(也许)始终设置,无论其他键看起来如何,或者使用哪个浏览器。你能告诉我吗?
请注意,该$_FILES
变量还可以包含使用数组表示法上传的文件的多维数组,如下所示:
长版:
对于PSR-7 上传文件的实现,我需要对上传文件列表进行规范化。初始列表可以由用户提供,或者可以是使用表单(例如$_FILES
全局变量)上传标准文件的结果。对于规范化过程,我需要检查以下标准文件上传密钥之一的存在和“正确性”(可能是这个词的错误选择):
name
type
tmp_name
error
size
原则上,如果在提供的上传文件列表(也可以是多维数组)中找到选择的key(我tmp_name
现在选择的),则认为key所属的数组项是一个标准的文件上传数组项,包含上面的键列表。否则,例如,如果未找到所选密钥,则假定相应的数组项是UploadedFileInterface的实例。
$_FILES
不幸的是,在标准文件上传的情况下,无论其他列表键看起来如何,我都找不到关于哪个键(来自上面的列表)始终存在并且(可能)始终设置在变量中的可靠信息,或使用的浏览器。
如果您能在这件事上帮助我,我将不胜感激。
谢谢你。
php - PHP 7 PSR-7 响应测试脚本是否可以在内存有限的情况下使用 GD 调整图像大小
我使用带有 GD 库的 PHP 7.1。
我的脚本会在保存之前下载图像并调整其大小。服务器有 256MB 内存(不能增加)。
一些图像具有较大的物理尺寸(不是文件大小),大于 50Mpx。当我尝试使用 GD 调整它的大小时,此行中出现内存限制错误:
脚本以 PSR-7 HTTP 响应的形式获取图像。在调整图像大小之前,我需要测试它是否有足够的内存来调整图像大小?
我尝试按文件大小测试图像,但它会丢弃物理大小正常但文件大小较大的图像:
例如,我的脚本在图像 50.2Mpx 1.51MB 时失败,但在 3.6Mpx 1.02MB 时没问题。
我的想法是通过获取 Mpx 计数来测试图像:
所以我需要测试脚本是否可以根据 Mpx 计数在内存有限的情况下调整图像大小。如何从 PSR-7 响应对象中获取它?
php - 去掉body PSR-7 Slim3中间件?
我试图在未通过身份验证时将用户重定向到登录页面。我在 Slim3 中使用中间件来检查 Sentinel。有效,但我需要覆盖正文以不显示内容。例如,我可以使用 CURL 访问 /users 之类的路由,然后我可以获取所有页面。因此,如果用户未通过身份验证,我需要删除/覆盖正文。
php - 更改 Slim 请求属性
如何更改 Slim 请求的 URI 路径?但是,我尝试了以下操作,withPath()
克隆了 uri,因此请求对象没有更改。如果不可能,是否有基于原始请求但新的 URI 路径创建新 Slim 请求的简单过程?
关于我为什么要这样做的背景。我有一个接受 Slim 请求的方法,使用 Guzzle 向另一台服务器执行 cURL 请求,写入 Slim 响应,并返回 Slim 响应。Guzzle 查询几乎相同路径但带有版本号的 API。
php - PSR-15 中间件:是否期望中间件 *instance* 可以重复用于不同的请求?
我在网上找不到任何清楚说明这一点的文章或文档。PSR-15 中间件对象是否期望可重用或每个服务器请求都意味着创建全新的中间件实例?
当需要将数据保存在中间件实例属性中并确保此类中间件仍可用于“事件驱动”环境(如 reactphp)时,这一点很重要。
php - 实现特定于路由的中间件
我设法将request-handler与aura-router与单个router handler结合使用。
我正在尝试实现特定于路由的中间件,而不是“全局”应用程序中间件。