如何构build相对于页面URI的WebSocket URI?
我想在浏览器端构build一个相对于页面URI的WebSocket URI。 说,在我的情况下,转换HTTP URI像
http://example.com:8000/path https://example.com:8000/path
至
ws://example.com:8000/path/to/ws wss://example.com:8000/path/to/ws
我现在正在做的是用“ws”replace前4个字母“http”,并附加“/ to / ws”。 有没有更好的办法呢?
如果您的Web服务器支持WebSocket(或WebSocket处理程序模块),那么您可以使用相同的主机和端口,只需更改您所显示的scheme即可。 有许多选项可以将Web服务器和Websocket服务器/模块一起运行。
我build议你看一下window.location全局的各个部分,并将它们连接在一起,而不是盲目的replacestring。
var loc = window.location, new_uri; if (loc.protocol === "https:") { new_uri = "wss:"; } else { new_uri = "ws:"; } new_uri += "//" + loc.host; new_uri += loc.pathname + "/to/ws";
请注意,某些Web服务器(即基于Jetty的Web服务器)当前使用path(而不是升级头)来确定是否应将特定的请求传递给WebSocket处理程序。 所以你可能会受到限制,你是否可以按照你想要的方式改变path。
这是我的版本,它添加的TCP端口的情况下,不是80或443:
function url(s) { var l = window.location; return ((l.protocol === "https:") ? "wss://" : "ws://") + l.hostname + (((l.port != 80) && (l.port != 443)) ? ":" + l.port : "") + l.pathname + s; }
编辑1:通过@kanaka的build议改进版本:
function url(s) { var l = window.location; return ((l.protocol === "https:") ? "wss://" : "ws://") + l.host + l.pathname + s; }
编辑2:现在我创buildWebSocket
这个:
var s = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/ws");
假设您的WebSocket服务器正在侦听与请求页面相同的端口,我会build议:
function createWebSocket(path) { var protocolPrefix = (window.location.protocol === 'https:') ? 'wss:' : 'ws:'; return new WebSocket(protocolPrefix + '//' + location.host + path); }
那么,你的情况,如下所示:
var socket = createWebSocket(location.pathname + '/to/ws');
在本地主机上,你应该考虑上下文path。
function wsURL(path) { var protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://'; var url = protocol + location.host; if(location.hostname === 'localhost') { url += '/' + location.pathname.split('/')[1]; // add context path } return url + path; }
简单:
window.location.href.replace('http', 'ws') + '/to/ws'