我想发送一个带有或不带有"令牌"作为标头的请求。
-
如果请求将"Token"作为标头:如果用户已经拥有该项目,它将返回具有特定用户正确item_id的项目(基于其令牌),否则它将返回 null。
-
如果请求没有"令牌"作为标头:它将返回带有该item_id的项目
我正在使用Zend框架,在ItemResource中我有这种方法:
public function fetch($id)
{
}
如何检查我的请求是否有 Token 作为标头并在 fetch() 中实现这两种情况?
使用Laminas API工具,这取决于您使用的是RPC还是REST资源。我将解释Laminas API工具为您提供哪些工具来评估收到的标头数据。
您不必重新发明轮子,因为当您使用fetch
方法时,Laminas API Tools 已经准备好了收到的标头。
具象状态转移 (REST)
休息资源通常会扩展LaminasApiToolsRestAbstractResourceListener
类。本课程听LaminasApiToolsRestResourceEvent
。幸运的是,此事件为您提供了一个请求对象,该对象还包含收到的标头数据。
<?php
declare(strict_types=1);
namespace MarcelV1RestExample;
use LaminasApiToolsRestAbstractResourceListener;
class ExampleResource extends AbstractResourceListener
{
public function fetch($id)
{
// requesting for an authorization header
$token = $this->getEvent()->getRequest()->getHeader('Authorization', null);
if ($token === null) {
// header was not received
}
}
}
如您所见,ResourceEvent
在调用getRequest()
时返回一个LaminasHttpRequest
实例。请求实例已包含您收到的所有请求标头。只需使用给定的名称调用getHeader
,并作为第二个参数调用默认值,当未设置标头时,应返回该值。如果没有http_token
标头,则结果将变为 null。
远程过程调用 (RPC)
由于 RPC 请求是使用 MVC 控制器类处理的,因此可以像在 rest 资源中一样轻松地获取请求。控制器类从LaminasMvcControllerAbstractActionController
扩展而来, 已经包含一个请求实例。
<?php
declare(strict_types=1);
namespace MarcelV1RpcExample;
use LaminasMvcControllerAbstractActionController;
class ExampleController extends AbstractActionController
{
public function exampleAction()
{
$token = $this->getRequest()->getHeader('Authorization', null);
if ($token === null) {
// token was not set
}
}
}
如您所见,在 rpc 请求中获取标头数据与在资源侦听器中一样简单。该过程是相同的,因为此处也使用请求实例。
结论
绝对不需要编码已经存在的东西。只需从事件或抽象控制器获取请求实例,然后检索所需的标头。请始终记住,在处理原始数据时,存在CRLF注入等安全方面。Laminas框架已经为您处理了所有这些。
此外,您可以通过调用->getHeaders()
而不是->getHeader($name, $default)
来检查所有收到的标头。您将获得一个包含所有已接收标头的LaminasHttpHeader
实例。
您可以通过getallheaders()获取所有HTTP标头值,或者仅通过$_SERVER['HTTP_XXX']
获取特定值,在您的情况下,将XXX
替换为Token
,$_SERVER['HTTP_Token']
。
手册:https://www.php.net/manual/en/reserved.variables.server.php
public function fetch($id)
{
$token = $_SERVER['HTTP_Token'];
// do your busniess code
}