vue-resource2.0已經(jīng)不再更新袍暴,所以vue2.0官方推薦使用axios來代替。
實(shí)際項目也是應(yīng)用上了vue+axios隶症,然后就有了這么一段填坑的經(jīng)歷政模。
問題:axios使用post請求時,發(fā)送了兩次蚂会,而get則正常淋样。
第一次請求不是正確的post請求,第二次才是正確的
調(diào)出谷歌開發(fā)者工具
“Request Method: OPTIONS”
什么鬼颂龙,post請求時习蓬,這里的“Request Method”居然不是post,而是這個OPTIONS措嵌。注意:它還是額外發(fā)送的躲叼。
項目中采用前后端分離的開發(fā)方式,前端通過調(diào)用后端API實(shí)現(xiàn)數(shù)據(jù)傳輸企巢。
后端同學(xué)則通過反向代理解決了前端跨域的問題枫慷。(前端調(diào)接口跟在同域下使用時一樣,該怎么用怎么用)
找到原因:其實(shí)這個情況并非bug,而是當(dāng)項目中有用到跨域請求時或听,除了get方式的http請求探孝,都會發(fā)送一個預(yù)檢請求。
跨域資源共享標(biāo)準(zhǔn)新增了一組 HTTP 首部字段誉裆,允許服務(wù)器聲明哪些源站有權(quán)限訪問哪些資源顿颅。另外,規(guī)范要求足丢,對那些可能對服務(wù)器數(shù)據(jù)產(chǎn)生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求粱腻,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個預(yù)檢請求(preflight request)斩跌,從而獲知服務(wù)端是否允許該跨域請求绍些。服務(wù)器確認(rèn)允許之后,才發(fā)起實(shí)際的 HTTP 請求耀鸦。在預(yù)檢請求的返回中柬批,服務(wù)器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))袖订。
相關(guān)資料https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_C
解決方案:只能麻煩后端同學(xué)幫忙處理下
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Headers:content-type");
header("Access-Control-Request-Method:GET,POST");
if(strtoupper($_SERVER['REQUEST_METHOD'])== 'OPTIONS'){
exit;
}
后端遇到請求方式是“Request Method: OPTIONS” 時氮帐,直接返回或退出即可,不再往下執(zhí)行程序著角。
上述header的設(shè)置用的是PHP的設(shè)置方法揪漩,在Web服務(wù)器端,如nginx, apache也可以對header進(jìn)行設(shè)定吏口。