當使用fetch 發起跨域請求時,CORS(跨域資源共享Cross-origin resource sharing)
請求fetch
const body = {name:"Good boy"};
fetch("http://localhost:8000/API",{
headers:{
'content-type':'application/json'
}
method:'POST',
body: JSON.stringify(body)
}).then(response =>
response.json().then(json => ({ json, response }))
).then(({ json, response }) => {
if (!response.ok) {
return Promise.reject(json);
}
return json;
}).then(
response => response,
error => error
);
如果伺服器傳回的 response 頭包含 “Access-Control-Allow-Origin:*”或者 *為與請求源相同的位址。即伺服器支援浏覽器跨域通路。若不包含需求修改伺服器端,與浏覽器端請求。
CORS的具體原理可以參考 http://www.ruanyifeng.com/blog/2016/04/cors.html
如果伺服器不支援CORS,fetch提供了三種模式,其中no-cors可以繼續通路伺服器
fetch的mode配置項有3個值,如下:
same-origin:該模式是不允許跨域的,它需要遵守同源政策,否則浏覽器會傳回一個error告知不能跨域;其對應的response type為basic。
cors: 該模式支援跨域請求,顧名思義它是以CORS的形式跨域;當然該模式也可以同域請求不需要後端額外的CORS支援;其對應的response
type為cors。
no-cors: 該模式用于跨域請求但是伺服器不帶CORS響應頭,也就是服務端不支援CORS;這也是fetch的特殊跨域請求方式;其對應的response
type為opaque。
針對跨域請求,cors模式是常見跨域請求實作,但是fetch自帶的no-cors跨域請求模式則較為陌生,該模式有一個比較明顯的特點:
該模式允許浏覽器發送本次跨域請求,但是不能通路響應傳回的内容,這也是其response type為opaque透明的原因。
注意: cors 支援 三種content-type 不支援 application/json
application/x-www-form-urlencoded
multipart/form-data
text/plain
為了能将請求 text/plain的body 解析為json對象,可以參考
http://stackoverflow.com/questions/12345166/how-to-force-parse-request-body-as-plain-text-instead-of-json-in-express
對于Express提供的服務端
為了能提供CORS服務
需要添加:
//設定跨域通路
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
當使用fetch 發起跨域請求時,CORS(跨域資源共享Cross-origin resource sharing)
請求fetch
const body = {name:"Good boy"}; fetch("http://localhost:8000/API",{ headers:{ 'content-type':'application/json' } method:'POST', body: JSON.stringify(body)}).then(response => response.json().then(json => ({ json, response }))).then(({ json, response }) => { if (!response.ok) { return Promise.reject(json); } return json;}).then( response => response, error => error );123456789101112131415161718如果伺服器傳回的 response 頭包含 “Access-Control-Allow-Origin:*”或者 *為與請求源相同的位址。即伺服器支援浏覽器跨域通路。若不包含需求修改伺服器端,與浏覽器端請求。
CORS的具體原理可以參考 http://www.ruanyifeng.com/blog/2016/04/cors.html
如果伺服器不支援CORS,fetch提供了三種模式,其中no-cors可以繼續通路伺服器fetch的mode配置項有3個值,如下:
same-origin:該模式是不允許跨域的,它需要遵守同源政策,否則浏覽器會傳回一個error告知不能跨域;其對應的response type為basic。cors: 該模式支援跨域請求,顧名思義它是以CORS的形式跨域;當然該模式也可以同域請求不需要後端額外的CORS支援;其對應的response type為cors。no-cors: 該模式用于跨域請求但是伺服器不帶CORS響應頭,也就是服務端不支援CORS;這也是fetch的特殊跨域請求方式;其對應的response type為opaque。針對跨域請求,cors模式是常見跨域請求實作,但是fetch自帶的no-cors跨域請求模式則較為陌生,該模式有一個比較明顯的特點:
該模式允許浏覽器發送本次跨域請求,但是不能通路響應傳回的内容,這也是其response type為opaque透明的原因。
注意: cors 支援 三種content-type 不支援 application/json
application/x-www-form-urlencodedmultipart/form-datatext/plain
為了能将請求 text/plain的body 解析為json對象,可以參考 http://stackoverflow.com/questions/12345166/how-to-force-parse-request-body-as-plain-text-instead-of-json-in-express
對于Express提供的服務端為了能提供CORS服務 需要添加:
//設定跨域通路 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1') res.header("Content-Type", "application/json;charset=utf-8"); next(); }); --------------------- 作者:Evan_Gu 來源:CSDN 原文:https://blog.csdn.net/gdp12315_gu/article/details/66479524 版權聲明:本文為部落客原創文章,轉載請附上博文連結!