当使用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 版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. js实现动态操作table
  2. python基础整理笔记(七)
  3. android Gui系统之SurfaceFlinger(2)---BufferQueue
  4. 洛谷P1288 取数游戏II
  5. Android之Activity框架
  6. 忘记Mysql的root密码的处理办法
  7. Java基础笔记-异常总结,包
  8. WHAT?【 $.fn.extend() 】vs【 $.extend() 】
  9. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程
  10. CkEditor批量上传图片(java)
  11. WIN7远程桌面连接--“发生身份验证错误。要求的函数不受支持”
  12. 思科模拟器PacketTracer7--利用一台交换机将两台pc划分到不同vlan下
  13. 第3章 Data语意学
  14. Linux虚拟机安装及环境搭建
  15. 【Android自动化】unittest测试框架关于用例执行的几种方法
  16. JVM heap中各generation的大小(Sizing the Generations)
  17. iOS 所有设备一览 && CoreFoundation源码
  18. POJ - 3169 差分约束
  19. dfs 队列
  20. Android中UI线程与后台线程交互设计的6种方法

热门文章

  1. OSWatcher使用过程中小问题解决方法
  2. C#-方法(八)
  3. 洗礼灵魂,修炼python(85)-- 知识拾遗篇 —— 深度剖析让人幽怨的编码
  4. Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
  5. iOS 验证码按钮倒计时
  6. 【爬坑】远程连接 MySQL 失败
  7. Centos7安装搭建FTP服务器(最简便方法)
  8. celery 定时任务
  9. docker基础学习(一)
  10. Windows重启显卡驱动热键说明