如何访问WebSocket端点?

18

我看到有一个WebSocket端点,可以与Java测试很好地配合使用。在日志中我看到:

Connecting to: ws://127.0.0.1:8080/76f48a44-0af8-444c-ba97-3f1ed34afc91/tweets  

就像其他任何REST API一样,我想通过浏览器或curl进行访问,但是当我这样做时,我看到了:

与其他REST API类似,我希望能够通过浏览器或Curl来访问它。但是当我这样做时,我看到了:

➜  tweetstream git:(master) ✗ curl ws://127.0.0.1:8080/b9b90525-4cd4-43de-b893-7ef107ad06c2/tweets  
curl: (1) Protocol ws not supported or disabled in libcurl  

以及

➜  tweetstream git:(master) ✗ curl http://127.0.0.1:8080/b9b90525-4cd4-43de-b893-7ef107ad06c2/tweets
<html><head><title>Error</title></head><body>Not Found</body></html>%  

有没有一种方法可以使用浏览器/ curl 测试 WebSocket API?


Websockets不像HTTP一样是RESTful协议。确保您使用正确的工具来完成工作。 - Halcyon
14
你知道正确的工具吗?我对WebSockets还相当陌生。 - daydreamer
8个回答

16

6
没有终点,只是测试根网址。我认为原始问题是关于特定终点的,例如ip:port/endpoint/. - Mikael

9
如果您想要测试Websockets的实现,我发现Autobahn的测试套件非常有用:http://autobahn.ws/ 如果您只是想使用WebSocket进行一些简单的测试,我建议您使用像Chrome这样的浏览器中的开发者工具来建立连接并发送/接收数据:
var ws = new WebSocket("ws://127.0.0.1:8080/76f48a44-0af8-444c-ba97-3f1ed34afc91/tweets");
ws.onclose = function() { // thing to do on close
};
ws.onerror = function() { // thing to do on error
};
ws.onmessage = function() { // thing to do on message
};
ws.onopen = function() { // thing to do on open
};
ws.send("Hello World");

9

为了完整性,我想要添加自己的CLI工具:websocat

$ websocat wss://echo.websocket.org/
qwer
qwer
1234
1234

它虽然不能替代浏览器,但在这种情况下应该是“curl”的有效替代品。

哦,抱歉,我没有注意到那个,我看到了这个https://github.com/vi/websocat/issues/1的待办事项列表,最后面写着“指定cookie和其他HTTP头部。”,但我没有注意到旁边的框框被勾选了,也没有注意到它是2018年的。抱歉,在发表评论之前我应该更加确定一些。我现在会删除评论,并稍后删除这条评论,以便您看到。 - undefined

5

我必须使用这个命令才能使它工作:

$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: echo.websocket.org" -H "Origin: http://www.websocket.org" -H "Sec-WebSocket-Version: 13" -H 'Sec-WebSocket-Key: +onQ3ZxjWlkNa0na6ydhNg==' http://www.websocket.org

我正在使用Jetty,如果我没有添加Sec-WebSocket-Version/Sec-WebSocket-Key,它就无法工作。仅供参考。


2

1
curl --include \
--no-buffer \
--header "Connection: Upgrade" \
--header "Upgrade: websocket" \
--header "Host: echo.websocket.org" \
--header "Origin: http://echo.websocket.org" \
--header "Sec-WebSocket-Version: 13" \
http://echo.websocket.org


如果WebSocket端点配置有额外的子协议,请添加标头:
--header "Sec-protocol: protocol-name"

将原点、主机和端点替换为您自己的服务器进行测试。如果启用了基本身份验证,请像这样添加Authorization头:
 --header "Authorization: Basic RVZCLVAxNzI2MzAzOv"

1

简而言之 curl -H 'Upgrade: websocket' -H "Sec-WebSocket-Key: `openssl rand -base64 16`" -H 'Sec-WebSocket-Version: 13' --http1.1 -sSv https://ws.ifelse.io(根据服务器的不同,您可能需要提供Origin和/或Connection: Upgrade

首先,websocket协议是如何工作的?客户端连接到服务器,发送握手请求,接收“101 Switching Protocols”(握手响应),然后他们来回发送frames

握手大致如下:

GET / HTTP/1.1
Host: ws.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
Origin: http://example.com

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

升级 使其从HTTP(s)切换到websocket协议。

连接 指定升级是一个跳站头(中间人应该消耗而不是转发的头)。但我的实验表明,如果服务器前面有反向代理(例如nginx),则可以在没有此头的情况下工作。或者更准确地说,它可能是可选的。

Sec-WebSocket-Key/Sec-WebSocket-Accept是一种安全措施,详见此处, 此处此处

Sec-WebSocket-Version指定了websocket协议的版本。根据RFC 6455规定,它应该等于13。

当客户端是浏览器且请求页面的来源与websocket服务器URL的来源不匹配时,需要使用Origin

有关应构成websocket握手请求的详细说明可以在此处找到。

这就是HTTP/1.1的工作方式。HTTP/2则是另一回事

了解这一点以使用curl建立websocket连接:

$ curl -H 'Upgrade: websocket' \
       -H "Sec-WebSocket-Key: `openssl rand -base64 16`" \
       -H 'Sec-WebSocket-Version: 13' \
       --http1.1 \
       -sSv \
       https://ws.ifelse.io
...
> GET / HTTP/1.1
> Host: ws.ifelse.io
> Upgrade: websocket
> Sec-WebSocket-Key: e2dujvcbYbN747lapeH+WA==
> Sec-WebSocket-Version: 13
...
< HTTP/1.1 101 Switching Protocols
< Connection: upgrade
< upgrade: websocket
< sec-websocket-accept: 6wmMGMtN00aWw3loYd6P36EHKMI=

其他选项包括wscatwebsocat

0
我编写了一个类似于cURL的WebSocket客户端。您可以通过此工具发送单个数据帧(文本/二进制),然后关闭套接字。此外,您还可以在初始HTTP升级过程中添加HTTP标头。

https://github.com/jussmen/WebSocket_cURL


如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - Castro Roy
@CastroRoy,嗯,看起来是一个合法的答案,尽管我没有测试它是否有效。 - akostadinov
任何刚发现这个应用程序无法工作或不再工作的人,请注意,已经使用Python2和Python3进行了测试。 - Paul J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接