0

在 toppage_handler.erl 中的牛仔 websocket 示例中

    handle(Req, State) ->
      {Echo, Req2} = cowboy_req:qs_val(<<"echo">>, Req),
      {ok, Req, State}.

我想将参数 Echo 放入以下函数

例如:

本地主机:8080/?echo=123

在 ws_handler.erl

    websocket_init(_TransportName, Req, _Opts) ->
         %%How can I use the Echo(123) here?
         erlang:start_timer(1000, self(), <<"Hello!">>),
         {ok, Req, undefined_state}.
4

1 回答 1

0

一个简单的解决方法是使用路径绑定:

在您的路线中:

Dispatch = cowboy_router:compile([
    %% {HostMatch, list({PathMatch, Handler, Opts})}
    {'_', [{"/echo/:echo", my_handler, []}]}
]),

然后在您的代码中:

{Echo, Req2} = cowboy_req(echo,Req)

最好在 Websocket_handle 中执行此操作,因为您将能够将响应发送到套接字。在 init 中,您必须在您的状态下携带它,如下所示:

websocket_init(_TransportName, Req, _Opts) ->
    {Echo, Req2} = cowboy_req:binding(echo,Req),
    erlang:start_timer(1000, self(), <<"Hello!">>),
    {ok, Req2, {Echo}}.

websocket_handle(_Frame, Req, {Echo}) ->
    {reply, {text, Echo}, Req, State}.

由于 websocket 旨在处理长期连接,我使用这样的绑定来支持通道、用户 ID 等信息。但不是像“echo”这样的数据,因为您需要发送多个不同的文本来回显而不关闭并重新打开websocket连接每次只是为了改变URL。

于 2013-08-08T08:19:47.683 回答