我試圖在我的應用程序中刪除不必要的飛行前請求。爲此,我簡化了請求的某些部分,刪除了自定義標題等。但是遇到了一個問題 - GET請求現在可以正常工作,不需要預先飛行,但POST請求仍然有它們。CORS:在GET上沒有預先飛行,但在POST上進行了預先飛行
我已經按照要求:
- 請求不設置自定義HTTP標頭。
- 內容類型爲「text/plain; charset = utf-8」。
- 請求方法必須是GET,HEAD或POST之一。如果POST,內容類型應該是application/x-www-form-urlencoded,multipart/form-data或text/plain之一。
GET和POST請求均經過單個httpinvoke調用。
爲例 - GET請求不被飛行前的開頭:
網址:
http://mydomain/APIEndpoint/GETRequest?Id=346089&Token=f5h345
請求方法:GET
請求頭:
接受:
*/*
接受編碼:gzip,放氣
接受語言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,連接; Q = 0.2
緩存 - 控制:無緩存
連接:保持活躍
的Content-Type:text/plain的;字符集= UTF-8
主持人:正確的主機
來源:
http://localhost
雜注:無緩存
的Referer:正確引用者
的User-Agent:Mozilla的/ 5.0(視窗NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/60.0.3112.90 Safari/537。36
查詢字符串參數:
編號= 346089
令牌= f5h345
而且看起來非常相似,但仍與飛行前開頭的POST請求:
URL:
http://mydomain/APIEndpoint/GETRequest?param=TEST
請求方法:POST
請求報頭:
接受:
*/*
接受編碼:gzip,放氣
接受語言:UK-UA,UK; Q = 0.8,ru; q = 0.6,en-US; q = 0.4,en; q = 0.2
Cache-Control:no-cache
連接:保持活躍
的Content-Length:11
的Content-Type:text/plain的;字符集= UTF-8
主機:
產地:
http://localhost
附註:無緩存
的Referer: 的User-Agent:Mozilla的/ 5.0(Windows NT的10.0; Win64上; x64)的爲AppleWebKit/537.36(KHTML,例如Gecko)鉻/ 60.0.3112.90 Safari瀏覽器/ 537.36
查詢字符串參數:
PARAM:TEST
請求負載
{邁德特:{}}
任何意見,將不勝感激!謝謝!
====更新===
按照要求,對於張貼POST請求飛行前的要求:
網址:
http://mydomain/APIEndpoint/GETRequest?param=TEST
請求方法:OPTIONS
狀態代碼:200確定
響應標頭
訪問控制允許來源:
*
緩存控制:無緩存
的Content-Length:0
日期:星期三,2017年8月9日8時02分16秒GMT
截止日期:-1
雜注:無緩存
服務器:Microsoft-IIS/8.5
X-ASPNET-版本:4.0.30319
X供電,通過:ASP.NET
請求頭
接受:
*/*
Accept-Encoding:gzip,deflate
Accept-Langu年齡:UK-UA,英國; Q = 0.8,如; Q = 0.6,EN-US; Q = 0.4,連接; Q = 0.2
訪問控制請求-方法:POST
的cache控制:無緩存
連接:保持活躍
主持人:正確的主機
來源:
http://localhost
雜注:無緩存
Referer:correct referer
User-Agent:Mozilla/5.0(Windows NT 10.0; Win64平臺; 64)爲AppleWebKit/537.36(KHTML,例如Gecko)Chrome瀏覽器/ Safari瀏覽器60.0.3112.90/537.36
查詢字符串參數
PARAM:TEST
這是它使用httpinvoke庫中的遺留代碼。代碼片斷實際執行的呼叫:
_converters: {
'text json': function (input, reviver) {},
'json text': JSON.stringify
};
headers = {
'Content-Type': 'text/plain; charset=utf-8'
};
data = {params: "test"};
httpinvoke(url, method.toUpperCase(), {
corsExposedHeaders: ['Content-Type'],
headers: headers,
input: data,
converters: _converters,
inputType: 'json',
outputType: 'json',
timeout: self._getMessageTimeout()
}).then(function (res) {}, function (error) {});
需要說明的是,您能否準確解釋如何知道瀏覽器在GET請求的情況下未進行預檢?例如,我猜你可能已經瀏覽了瀏覽器devtools中的網絡窗格,並且您看到瀏覽器正在顯示POST的預檢而不是GET?並且POST請求的情況是預檢成功還是您的瀏覽器devtools控制檯顯示有關預檢的任何類型的錯誤消息? – sideshowbarker
是的,我使用DEV工具來檢查結果。是的,如果POST預先飛行確實成功。可以肯定的是,請求網址是正確的,因爲它們可以很好地處理舊版本的請求。舊版本在GET和POST版本的頭文件中都有自定義字段,都生成了預檢請求。 – North
非常感謝,在OPTIONS請求的響應中,沒有Access-Control-Allow-Headers響應頭?並且沒有Access-Control-Allow-Methods響應頭,儘管請求有一個Access-Control-Request-Method:POST請求頭? – sideshowbarker