Yii2 CORS插入两条记录

时间:2016-03-01 05:07:05

标签: ajax yii2 cors

我正在使用Yii2构建API,并且已启用CORS过滤器来处理来自正在运行的Web前端的请求。

然而,由于飞行前的OPTIONS请求,然后是真正的POST请求,我将两条记录添加到数据库中,每个请求一个。我原以为Yii应该接受OPTIONS请求,返回正确的标题然后退出。为什么它实际处理完整的请求?

我正在解决此问题,现在将其添加到控制器操作的顶部:

if(Yii::$app->request->getMethod() == 'OPTIONS') {
    return;
}

这是最好的方法还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

这应该是错误的,因为浏览器需要options响应来知道他可以发送的动词允许列表。否则可能会引发401错误。它的源代码可以看作here

class OptionsAction extends \yii\base\Action
{
    public $collectionOptions = ['GET', 'POST', 'HEAD', 'OPTIONS'];
    public $resourceOptions = ['GET', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];

    public function run($id = null)
    {
        if (Yii::$app->getRequest()->getMethod() !== 'OPTIONS') {
            Yii::$app->getResponse()->setStatusCode(405);
        }
        $options = $id === null ? $this->collectionOptions : $this->resourceOptions;
        Yii::$app->getResponse()->getHeaders()->set('Allow', implode(', ', $options));
    }
}

这就是它的全部功能:在响应头中发送允许的动词列表。

由于意外的响应,可能已经从客户端脚本发送了两次POST请求。尝试应用我在您的其他问题中发布的答案。我认为它也将解决这个问题:

Yii2 CORS with Auth not working for non CRUD actions