是否可以通过 websocket 调用 http API?

Posted

技术标签:

【中文标题】是否可以通过 websocket 调用 http API?【英文标题】:Is it possible to call http API by websocket? 【发布时间】:2021-08-29 11:53:28 【问题描述】:

我被要求在工作中使用 websocket 和 php Ratchet 进行 api 调用。由于我对websocket完全不熟悉,所以我google并观看了youtube视频来解决这个问题,但是我搜索的越多,我就越觉得用websocket调用api是不可能的。

是我遗漏了什么,还是真的不可能通过 websocket 调用 api? 如果可能的话,你能告诉我一个例子如何做到这一点

我知道我可能听起来很尴尬,因为我对 websockets 没有扎实的了解,英语甚至不是我的第一语言,但我真的很绝望,请帮助我

【问题讨论】:

什么 API?您不能从 Web 套接字调用 HTTP API。您可以从 Web 套接字调用 Web 套接字 API。这主要意味着您通过 Web 套接字向服务器发送一些特定的消息,然后服务器会返回一些特定的消息。 不太清楚你实际上被要求做什么,你能再看看描述 @RiggsFolly 例如,我试图通过 websocket 调用 marinetraffic.com/en/ais-api-services/documentation/… 这个 api @deceze 所以你的意思是有 web socket API 可以用于 web socket 而不是 HTTP API? 我假设您将拥有一些控制 PHP 代码,正常调用 API,然后我假设您想通过 websocket 分发结果。这两个位可以存在于同一代码中,但您没有使用 websocket 调用 AIS API 【参考方案1】:

REST API 与 WebSocket API 根本不同。

REST API

通过 HTTP(S) 进行调用。您可以使用 AJAX(参见此处:https://en.wikipedia.org/wiki/Ajax_(programming))直接从浏览器访问 HTTP 端点。在 javascript 中,您将使用 Fetch-API(参见此处:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)进行调用。根据定义,每个调用都是无状态的。必须随每个请求发送 Cookie 和特殊标头以创建上下文(例如登录的用户)。

示例(客户端):

fetch('http://example.com/my-rest-api/endpoint1')
  .then(response => response.json())
  .then(data => console.log(data));

示例(服务器):

app.get('/my-rest-api/endpoint1', handlerFunc);

WebSocket API

必须在客户端和服务器之间建立有状态的连接。客户端和服务器可以通过连接交换消息。与 REST-API 不同,消息可以双向发送。 WebSocket API 的高级实现是 Socket.io。 可以通过定义带有有效负载的消息类型来设计 API。 我也不建议将 PHP 用于 WS-API(即使有像 Ratchet 这样的解决方案)。使用为此类基于事件的用例开发的语言/运行时(例如 nodeJS)。

示例(客户端):

const socket = SocketClass('example.com/my-websocket-api');

// variant 1 with callbacks
const response = socket.sendMessage('endpoint1', myData);

// variant 2 with message listener
socket.on('endpoint1Response', handlerFunc);
socket.sendMessage('endpoint1', myData);

示例(服务器):

const serverSocket = SocketClass('/my-websocket-api');
serverSocket.on('connection', function (socket) 

    // variant 1 with callbacks
    socket.on('endpoint1', (data, callback) => 
        callback(null, responseData);
    );

    // variant 2 with message listener
    socket.on('endpoint1', (data, cb) => 
        socket.emit('endpoint1Answer', responseData);
    );
);

【讨论】:

以上是关于是否可以通过 websocket 调用 http API?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用带有所需端口的 http 方案,比如 6500,而不是 WebSockets 中的 ws 和 wss 方案?

websocket 升级是不是仍然允许 http ajax 请求?

WebSocket连接鉴权的过程

每分钟调用相同的 API 超过 2000 次(JSON/PYTHON),使用(HTTP 同步、HTTP 异步、Websocket 或其他)?

Websocket:是不是可以从程序中知道调用 onClose 的原因是啥

java http可以websocket不行