2016-03-01 75 views
0

我正在用Yii2构建一个API,并已启用CORS过滤器来处理来自正在工作的Web前端的请求。Yii2 CORS插入两条记录

但是,由于飞行前OPTIONS请求,然后真正的POST请求,我得到两个记录添加到数据库中,每个请求一个。我会认为Yii应该接受OPTIONS请求,返回正确的头文件然后退出。为什么它实际上处理完整的请求?

我解决这个现在工作了,加入这个控制器动作的顶部:

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

是最好的办法还是我失去了一些东西?

+0

在CORS中,您应该使用''Access-Control-Request-Headers'=> ['Expiry']'来继续您的算法。 –

+0

你的'urlManager :: rules'配置如何?你是如何设置CORS过滤器的?默认情况下'yii \ rest \ UrlRule'会将任何OPTIONS动词重定向到'yii \ rest \ OptionsAction'这个角色只会传递一个被接受的动词列表。因此,对于默认配置,OPTIONS谓词不可能被视为POST。也许一个错误的选项答案是让前端重新发送POST请求。请显示更多代码,并在浏览器的网络选项卡中检查已发送请求的已排序列表。 –

+0

这似乎不再是一个问题。 Yii的更高版本将在CORS标头发送后退出脚本。 – Dubby

回答

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