如何解决对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服务器-客户端上也可以正常工作。
解决方法
您可以将以下日志添加到
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 举报,一经查实,本站将立刻删除。