当前位置: 首页 > 知识库问答 >
问题:

CakePHP 3 REST API CORS请求和OPTIONS方法

萧晔
2023-03-14

我正在使用CakePHP3开发RESTAPI。我想公开启用它,这样任何人都可以调用API。因此,我添加了如下定义的cors标题:http://book.cakephp.org/3.0/en/controllers/request-response.html#setting-跨源请求头

我已经在Dispatcher上实现了EventListener。在调度和调度之前。发货前,准备cors标题。

class ApiResponseHeaders implements EventListenerInterface
{

    /**
     * Event bindings
     *
     * @return array
     */
    public function implementedEvents()
    {
        return [
            'Dispatcher.beforeDispatch' => [
                'callable' => 'beforeDispatch',
                'priority' => 0
            ],
            'Dispatcher.afterDispatch' => [
                'callable' => 'afterDispatch',
                'priority' => 99999
            ]
        ];
    }

    public function beforeDispatch(Event $event)
    {
        $request = $event->data['request'];
        if ('OPTIONS' === $request->method()) {
            $event->stopPropagation();
        }
    }

    public function afterDispatch(Event $event)
    {
        $request = $event->data['request'];
        $response = $event->data['response'];

        $response->cors($request)
                ->allowOrigin('*')
                ->allowMethods(['GET', 'POST', 'OPTIONS'])
                ->allowHeaders(['Content-Type, Authorization, X-Requested-With, Accept'])
                ->allowCredentials()
                ->maxAge(0)
                ->build();

        if ('OPTIONS' === $request->method()) {
            $event->stopPropagation();
        }
    }

}

但问题是,当我从AngularJS向APIendpoint发出POST请求时,它首先调用OPTIONS方法,然后调用POST方法。CakePHP不处理OPTIONS方法调用并返回:400坏请求

下面是示例请求和响应标头:

请求标头

OPTIONS /v1/account/login HTTP/1.1
Host: api.cake.dev
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://demo.angular.dev
Connection: keep-alive

响应报头

HTTP/1.1 400 Bad Request
Date: Wed, 07 Sep 2016 08:34:55 GMT
Server: Apache/2.4.17 (Win64) PHP/5.6.16
X-Powered-By: PHP/5.6.16
X-DEBUGKIT-ID: b4e5654a-cefb-43b7-bf19-4e8c7ffdb0e0
access-control-allow-origin: *
access-control-allow-methods: GET, POST, OPTIONS
access-control-allow-headers: Content-Type, Authorization, X-Requested-With, Accept
Access-Control-Allow-Credentials: true
access-control-max-age: 0
Content-Length: 147
Connection: close
Content-Type: text/html; charset=UTF-8

在CakePHP3中是否有一种方法可以处理这个选项请求并返回正确的响应,从而使下一个POST请求正常工作?

请帮忙。谢谢你们

共有3个答案

孙承弼
2023-03-14

如果你们真的坚持这一点,然后转到配置/bootstrap.php文件,添加以下行,你的问题就消失了

header('Access-Control-Allow-Origin: *');
欧阳玺
2023-03-14

对于CakePHP 3.3版本使用这个插件:https://github.com/ozee31/cakephp-cors

巫马英豪
2023-03-14

在CakePHP 3.2中,我是这样做的:

public function beforeRender(event $event) {
    $this->setCorsHeaders();
}

public function beforeFilter(event $event) {
    if ($this->request->is('options')) {
        $this->setCorsHeaders();
        return $this->response;
    }
}

private function setCorsHeaders() {
    $this->response = $this->response->cors($this->request)
        ->allowOrigin(['*'])
        ->allowMethods(['*'])
        ->allowHeaders(['x-xsrf-token', 'Origin', 'Content-Type', 'X-Auth-Token'])
        ->allowCredentials(['true'])
        ->exposeHeaders(['Link'])
        ->maxAge(300)
        ->build();
}

这样,我甚至可以处理CakePHP错误页面。

根据您的情况,您可以更改alloHeaders数组上的值。

请记住,如果请求将with Creentials设置为true,则需要指定起源。

 类似资料:
  • imi 框架内置了一个 OptionsMiddleware 中间件,用于解决使用 application/json 请求时,浏览器会先发送一个 OPTIONS 请求。并且可以解决跨域头问题。 类名:\Imi\Server\Http\Middleware\OptionsMiddleware 别名:OptionsMiddleware 中间件使用方法:https://doc.imiphp.com/com

  • 问题内容: 我正在尝试为我的角度应用程序启用oauth2令牌获取。我的配置运行正常(身份验证对于所有请求均正常运行,令牌提取也正常运行),但是有一个问题。 CORS请求要求在将GET OPTIONS请求发送到服务器之前。更糟糕的是,该请求不包含任何身份验证标头。我希望此请求始终返回200状态,而无需在服务器上进行任何身份验证。可能吗?也许我想念一些东西 我的Spring安全配置: angular

  • 本文向大家介绍ajax请求中为何会出现OPTIONS请求?相关面试题,主要包含被问及ajax请求中为何会出现OPTIONS请求?时的应答技巧和注意事项,需要的朋友参考一下 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/OPTIONS CORS会在请求前先发送OPTIONS请求

  • 我需要一些帮助,我不知道怎么做,但我的和<code>放入http。来自angular客户机的删除请求在中更改。我唯一的错误是: 如果有人有想法,谢谢回答我。 祝你今天愉快

  • 问题内容: 我开发了一个PhoneGap应用程序,现在将其转换为移动网站。除了一处小故障,一切都可以顺利进行。我通过POST请求使用了某个第三方API,该API在该应用中可以正常运行,但在移动网站版本中却无法运行。 仔细查看后,似乎AngularJS(我想实际上是浏览器)正在首先发送OPTIONS请求。今天,我对CORS有了很多了解,但似乎无法弄清楚如何完全禁用它。我没有访问该API的权限(因此无

  • 我可以通过在API类中添加方法(在相同的)来解决这一问题,但我希望不必对所有方法都这样做。 在处理一个选项请求时,如何找出实际的(Get/Post)资源方法?