我正在使用Yii2构建API,并且已启用CORS过滤器来处理来自正在运行的Web前端的请求。
然而,由于飞行前的OPTIONS请求,然后是真正的POST请求,我将两条记录添加到数据库中,每个请求一个。我原以为Yii应该接受OPTIONS请求,返回正确的标题然后退出。为什么它实际处理完整的请求?
我正在解决此问题,现在将其添加到控制器操作的顶部:
if(Yii::$app->request->getMethod() == 'OPTIONS') {
return;
}
这是最好的方法还是我错过了什么?
答案 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请求。尝试应用我在您的其他问题中发布的答案。我认为它也将解决这个问题: