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

dyd*_*ydy 1 php websocket phpwebsocket ratchet

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

是我遗漏了什么还是websocket调用api真的不可能?如果可能的话,您能给我举个例子吗?

我知道我可能听起来很尴尬,因为我对网络套接字没有深入的了解,英语甚至不是我的母语,但我真的很绝望,请帮助我

adr*_*ste 5

REST API 与 WebSocket API 有着根本的不同。

休息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));
Run Code Online (Sandbox Code Playgroud)

示例(服务器):

app.get('/my-rest-api/endpoint1', handlerFunc);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

示例(服务器):

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);
    });
});
Run Code Online (Sandbox Code Playgroud)