2016-03-01 82 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