php - Zend Framework 2 限制 REST API 只接受 application/json 或 application/xml

标签 php json rest zend-framework2

我想限制对我的 rest api 的访问,只使用请求“接受:”中的属性,值为“application/json 或 xml”,并且对于每个 rest 调用。我在哪里以及如何在 ZF2 单独的模块中仅针对 Rest 调用执行此操作。我的实现类似于此处的指南:enter link description here

最佳答案

您可以将监听器连接到 onroute 事件,检查 Accept header 值并返回 406 Not Acceptable对除 application/jsonapplication/xml 之外的所有 header 的响应。

onBootstrap 中连接你的监听器:

$eventManager->attach($serviceManager->get('Application\Listener\RestAcceptListener'));

在你的监听器中检查Accept header

/**
 * Check Accept header
 *
 * @param MvcEvent $event
 * @return Response
 */
public function onRoute(MvcEvent $event)
{
    $routeMatch = $event->getRouteMatch();
    $controller = $routeMatch->getParam('controller');

    // To limit for rest calls only you can do some controller check here
    // You can also do instanceof check this is all up to you...
    if( $controller !== 'somecontroller'){
        return;
    }

    $request = $event->getRequest();
    $headers = $request->getHeaders();

    $acceptHeader = $headers->get('Accept');

    // Check whether accept type corresponds to the allowed ones
    $accept = array('application/json', 'application/xml');
    if(!$acceptHeader->match($accept)){
        $response = new Response();
        $response->setStatusCode(406);
        return $response;
    }
}

更新:

要进行模块检查,您可以使用 Controller 的命名空间。例如使用 php explode 检查 Application 模块:

$parts = explode('\\', $controller, 2);
if ($parts[0] !== 'Application'){
    // We do not have a controller from Application module
    return;
}

关于php - Zend Framework 2 限制 REST API 只接受 application/json 或 application/xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578881/

相关文章:

php - SQL 连接/Doctrine/Symfony2 : Only getting one result from join when I expect multiple

php - 向 PHP 脚本发送和接收短信?

javascript - JSON 和 Javascript - 动态 DOM 操作

javascript - 按对象内部的值对数组对象进行 Angular 排序

spring - 为什么 Spring REST Controller 返回时我的图像 byte[] 会被编码?

php - 如何替换文本中的 youtube url?

php - 为什么对 PostgreSQL(在 PHP 上)的查询返回一个字符串数组而不是一个关联数组?

java - 如何在java中解析二维JSON数组

REST API 版本控制 - 流行的 API

angularjs - 使用 Laravel 和 AngularJS 的 RESTful API