Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Whistle 作为 API 服务网关

使用 Whistle 作为 API 服务网关

原创
作者头像
猫哥学前班
修改于 2019-09-30 13:09:30
修改于 2019-09-30 13:09:30
3.4K0
举报
文章被收录于专栏:猫哥学前班猫哥学前班

最近写了一款 React 的工具,能拉取团队成员 Jira 上的 Task 和 Bug,根据其 Task 的 Efforts 时长和 Bug 的修复时长,计算对应的绩效指标。

今天给大家介绍下,我是如何在这个项目中利用 Whistle 来实现 API 服务网关的(还不知道 Whistle ?看这里)。

在项目开发过程中,前端本地的 webpack 会启动服务并监听一个端口(例如 8000),浏览器访问 http://localhost:8000 即可进行页面的开发预览。

假如你的 Jira 站点为 https://jira.example.com ,此时,需要浏览器能直接对 Jira 的 Rest API 服务(https://jira.example.com/rest/api/)发起请求。

1. CORS 合法化配置

当浏览器向与当前页面域名不同的域名发起 API 请求时,会触发 CORS 策略,以确保请求是被目标服务所允许的。

本地开发时的域名是 localhost,API 服务是 example.com,所以会触发 CORS 及其 Preflight Request 策略。

CORS Error
CORS Error

Whistle 提供了 resCors 协议可以很方便的为 response 加上 CORS 相关的 Header(Access-Control-Request-* )。

如下图配置,我们可以设置允许来源 origin 为任意站点(*),允许自定义 Header Authorization 和 Content-Type 的使用:

代码语言:txt
AI代码解释
复制
https://jira.example.com/rest/api resCors://{resCorsTest.json} delete://req.headers.User-Agent

```resCorsTest.json
{
"origin": "*",
"headers": "authorization,content-type",
}
```

同时,我们还使用 delete 协议删除了请求头中的 UA 头信息(req.headers.User-Agent),让 API 服务无法判断出请求的发起方是否为浏览器(注意:Jira Rest API 会针对浏览器开启 XSRF Check)。

2. HTTP Header/Body 的过滤与修改

CORS 合法化配置完成后,浏览器已经可以成功发起跨域 API 请求,但在 console 控制台中,还有上图中的黄色 warning 需要消除。

这个 warning 的原因在于,options 请求的响应头中设置了 X-Content-Type-Options: nosniff,我们可以使用 includeFilter 针对 options HTTP Method,删除掉这个 Header:

代码语言:txt
AI代码解释
复制
https://jira.example.com/rest/api includeFilter://m:options delete://res.headers.X-Content-Type-Options 

如有需要,我们还可以利用 headerReplace 将某个 Header 替换成其他的值,以及使用 resBody 来设置 response 的 body 内容:

代码语言:txt
AI代码解释
复制
https://jira.example.com/rest/api headerReplace://res.Content-Type:/.*/=application/json resBody://({}) 

3. 同域网关

事实上,Whistle 作为代理网关,可以更加方便的绕过 CORS 策略限制。

我们只需为我们的静态页面和 API 服务设置一个相同的自定义域名,然后全部交给 Whistle 即可。

假如这里我们的自定义域名为:http://my.jira.com ,我们只需把对 http://my.jira.com/rest/api 的访问转发到 https://jira.example.com/rest/api 即可:

代码语言:txt
AI代码解释
复制
http://my.jira.com/rest/api https://jira.example.com/rest/api delete://headers.User-Agent
http://my.jira.com 127.0.0.1:8000

(注意:/rest/api 需要配置在前面,确保优先命中)

由于 Rest API 的域名和当前页面设置为同域,所以不会产生 CORS 与 Preflight Request 限制。

在本地开发完成后,我们可以使用 file 协议,直接将自定义域名映射到静态文件目录上。另外,由于需要在 JS 代码中隐藏 Jira HTTP 鉴权的用户名和密码,我们可以通过 auth 协议将这部分信息配置在 Whistle 网关中。以下是完整配置:

代码语言:txt
AI代码解释
复制
http://my.jira.com/rest/api https://jira.example.com/rest/api delete://headers.User-Agent auth://your-username:your-password 
http://my.jira.com file:///path/to/your/project/dist/

同域网关除了以上这种配置外,还有另外一种逆向思路:

将静态页面域名配置成实际的 API 服务域名,借助 xfile 协议,我们可以将未命中的请求全部转发到实际的线上服务,只需以下一行配置:

代码语言:txt
AI代码解释
复制
https://jira.example.com/ xfile:///path/to/your/project/dist/

需要注意的是,以上这种方法需要安装 Whistle CA 证书,用于解析 HTTPS 协议。

怎么样?把 Whistle 作为 API 服务网关,而不需要使用 Node 或 Nginx 服务来转发,是不是既简单又方便?赶紧试试吧:)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【网络知识补习】❄️| 由浅入深了解HTTP(五)跨源资源共享(CORS)
跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。
呆呆敲代码的小Y
2021/08/20
1.5K0
【网络知识补习】❄️| 由浅入深了解HTTP(五)跨源资源共享(CORS)
CORS攻击原理介绍和使用
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
全栈工程师修炼指南
2020/10/23
6.7K0
CORS攻击原理介绍和使用
后端工程师需要了解的跨域知识
产品有多端:机构端,局方端 ,家长端等 。每端都有独立的域名,有的是在PC上访问,有的是通过微信公众号来访问,有的是扫码后H5展现。
勇哥java实战
2022/01/14
1.1K0
后端工程师需要了解的跨域知识
一篇文章让你搞懂如何通过Nginx来解决跨域问题
出于安全考虑(比如csrf攻击),浏览器一般会禁止进行跨域访问,但是因为有时有相应需求,需要允许跨域访问,这时,我们就需要将跨域访问限制打开。   启动一个web服务,端口是8081
用户4919348
2020/06/21
40K2
前端应该知道的web调试工具——whistle
第一,whistle 是一个 web 调试代理工具,它的功能十分强大。作为一名前端,我们需要经常跟协议中的应用层打交道,Mock 数据、跨域问题、cookie 的修改、移动端调试等等,都是我们必备的技能,而 whistle 就能解决其中 90% 的问题
GopalFeng
2020/09/24
2.6K0
前端应该知道的web调试工具——whistle
Vite + whistle:一劳永逸的开发环境代理方案
我们用webpack或vite等工具开发本地项目时,浏览器一般会输入的域名是:127.0.0.1:3000来调试页面。当要请求三方接口时「随便拿个api来举例子」,就会发生下面情况。。。
南山种子外卖跑手
2022/02/22
2.5K1
Vite + whistle:一劳永逸的开发环境代理方案
014.Nginx跨域配置
同源策略是一个安全策略。同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。
木二
2020/07/21
8.4K0
014.Nginx跨域配置
CORS 跨域问题解决办法
我们在编写自己的网站时请求一些接口或者网页资源时,可能会遇到请求无响应的现象,这时按F12查看控制台会发现报出了下面这句错误,这其实就是跨域资源共享(CORS)协议阻止了请求。 Access to XNLAttpRequest at 'https://xxx.xxxx.xxx' from origin 'https://xxx.xxx.xxx' has xxx.xx been blocked by coRs policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
XG.孤梦
2022/09/23
2.4K0
CORS 跨域问题解决办法
为什么会有OPTIONS请求
在做项目时,很多时候发送一个post请求,是先发送一个option请求,然后再发送post请求,一直这么用之前也没有仔细思考,今天有时间,好好了解一下为什么会多一次请求。 疑问1:什么是options请求 OPTIONS请求方法的主要用途有两个: 1、获取服务器支持的HTTP请求方法; 2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。 这是浏览器给我们加上的,后端并没有做任何操作。 疑问2:为什么会
吴裕超
2018/02/28
54.7K0
为什么会有OPTIONS请求
怎么解决跨域
存在浏览器同源策略,所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到,跨域限制主要的目的就是为了用户的上网安全。
程序员子龙
2024/04/30
3250
工具系列 | 跨域资源共享 CORS 教程
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
Tinywan
2023/03/08
8820
工具系列 | 跨域资源共享 CORS 教程
【云函数SCF】浏览器请求函数URL,实现CORS
云函数可以让业务部署更快速更轻松,对于我来说,部署API非常方便,在以前API网关就担任了HTTP触发器的功能,不过在今年7月,API网关宣布了下架的消息,转而使用TSE云原生网关,不过对于我们业务量不大的用户来说,TSE的价格实在承担不起,而且很多功能也用不上
Ar-Sr-Na
2024/08/31
6551
python 生产实战 跨域资源那些事儿~
CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。本文详细介绍 CORS 的内部机制
python编程从入门到实践
2021/03/29
9270
【知识】跨源资源共享(CORS)的定义/使用场景/机制/格式
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源同源使用的限制。
辉哥
2022/05/13
1.4K0
【知识】跨源资源共享(CORS)的定义/使用场景/机制/格式
什么是 HTTP 请求中的 preflight 类型请求
在浏览器的 HTTP 请求中,当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时,浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前,先与目标服务器进行的一次 "探测" 请求,以确认服务器是否允许这样的请求方式。Preflight 请求的存在是为了保障浏览器的安全性,确保跨域请求不会在没有服务器允许的情况下进行。
编程小妖女
2025/02/02
6520
什么是 HTTP 请求中的 preflight 类型请求
跨域问题及CORS解决跨域问题方法
跨域不一定会有跨域问题。因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。
Java架构师必看
2021/03/22
13.1K0
深入了解 CORS
文章介绍了操作系统文件系统崩溃恢复机制,包括概念、日志系统特性,详细讲解了 xv6 文件系统写入文件操作步骤、各步骤功能及崩溃恢复情况,还指出 xv6 存在的问题及后续将介绍 Ext3 文件系统。
写bug的高哈哈
2024/11/12
3000
深入了解 CORS
Hystrix断路器在微服务网关中的应用(Spring Cloud Gateway)
在之前的一篇文章:微服务网关Zuul迁移到Spring Cloud Gateway,我们讲解了如何从Zuul迁移到新的组件:Spring Cloud Gateway,以及扩展了微服务网关的功能,包括限流过滤器、断路器过滤器等。然而很多读者在使用的时候反馈,使用POSTMAN发送GET请求测试断路器是正常的,然而POST请求会出现:
aoho求索
2018/12/29
1.9K0
报`Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.`错误解决办法
使用了promise,但是在使用的过程中报Uncaught (in promise)错误,第一次遇到这种错误,所以在此记录下,方便以后解决问题
天天Lotay
2023/04/16
3.6K0
报`Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.`错误解决办法
跨域共享CORS详解及Gin配置跨域
跨域简介 当两个域具有相同的协议(如http), 相同的端口(如80),相同的host,那么我们就可以认为它们是相同的域(协议,域名,端口都必须相同)。 跨域就指着协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的(例如一般情况跨域的JavaScript无法交互,当然有很多解决跨域的方案) 解决跨域几种方案 /* CORS 普通跨域请求:只服务端设置Access-Control-Allow-Origin即可, 前端无须设置,若要带cookie请求:前后端都需要设置。
iginkgo18
2020/12/01
1.9K0
相关推荐
【网络知识补习】❄️| 由浅入深了解HTTP(五)跨源资源共享(CORS)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档