对WSO2 API Manager Websocket的Socket.io支持吗?

如何解决对WSO2 API Manager Websocket的Socket.io支持吗?

WSO2 APIM管理器中的内置WebSocket API是否支持基于socket.io/nodejs的终结点?

我有基于socket.io的websocket服务器(位于NodeJS中)和socket.io javascript客户端,在这两者之间,我们使用WSO2 API管理器来验证Websocket连接。但是WSO2无法连接后端服务器,并且没有任何响应。 我使用了 access_token 查询参数来传递Bearer令牌(来自JavaScript客户端),它似乎没有错误。但是WSO2不会将请求转发到端点。

在本地WebSocket服务器-客户端上也可以正常工作。

解决方法

您可以将以下日志添加到 /repository/conf/log4j.properties,以进一步调试问题。 对于APIM 3.x.x,您可以根据log4j2进行更改并将其添加到log4j2.properties

log4j.logger.org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketSourceHandler=DEBUG log4j.logger.org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketResponseSender=DEBUG 
log4j.logger.org.wso2.carbon.websocket.transport.WebSocketClientHandler=DEBUG 
log4j.logger.org.wso2.carbon.websocket.transport.WebsocketTransportSender=DEBUG
,

最后,我摆脱了这个问题。 是的,WSO2 APIM websocket支持socket.io js库,这将是我自己查询的第一个答案。除此之外,还有一些发现。

真正的问题原因是socket.io库和WSO2 APIM使用的请求URL模式。 Socket.io JS库在资源(reference)的末尾带有/,这是最终URL,WSO2使用的查询分离逻辑不接受。

所以简单来说,这是可以接受的

ws://localhost:9099/livefeed/v1?EIO=4&transport=websocket

但不是这个

ws://localhost:9099/livefeed/v1/?EIO=4&transport=websocket

解决方案:

与WSO2团队进行了几次讨论之后,很明显不可能在他们的末端实施更改。因此,socket.io.js文件中的小技巧对我有用。

行号-2535

更改了此

_this.opts.path = _this.opts.path.replace(/\/$/,"") + "/";

对此

if(typeof opts.noslash!== 'undefined' && opts.noslash== "true"){
    _this.opts.path = _this.opts.path.replace(/\/$/,"");
}else{
   _this.opts.path = _this.opts.path.replace(/\/$/,"") + "/";
}

并使用额外的参数创建了套接字。

 var socket = io.connect("http://localhost:9099?access_token=90e8sf10-3s1w-495f-b20d-5a009f63193v",{ transports: ['websocket','polling'],path: '/livefeed/v1',noslash: 'true' });

我知道这不是一个实际的解决方案,但是对我有用。

,

先前的答案是针对socket.io JS客户端的,这与针对socket.io python客户端的相同。

从/home/user/.local/lib/python3.6/site-packages/engineio修改client.py文件

行号515

更改此内容

return ('{scheme}://{netloc}/{path}/?{query}'
                    '{sep}transport={transport}&EIO=3').format(...

对此

return ('{scheme}://{netloc}/{path}?{query}'
                        '{sep}transport={transport}&EIO=3').format(...

现在,我们可以使用条件参数来代替直接修改实际流。

if self.noslash == 'true':
            return ('{scheme}://{netloc}/{path}?{query}'
                    '{sep}transport={transport}&EIO=3').format(...

否则返回原始语句。

可以从python的engineio和socketio库中的connect()函数获取

noslash 参数。

def connect(self,url,headers={},transports=None,engineio_path='engine.io',noslash=None):
       self.noslash = noslash

这是python-socketio的示例连接字符串

sio.connect('http://localhost:9099',headers={'Authorization':'Bearer 90e8sf10-3s1w-495f-b20d-5a009f63193v'},transports=['websocket'],socketio_path='/livefeed/v1',noslash='true')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-