首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在f#聊天应用程序中使用rest api和websocket端口?

如何在f#聊天应用程序中使用rest api和websocket端口?
EN

Stack Overflow用户
提问于 2020-12-13 22:34:55
回答 1查看 262关注 0票数 5

我有一个f#聊天应用程序,它需要rest apis以及用于实时消息传递的websockets。我使用的是Suave框架。

我有一个前台,它有一个“聊天”按钮,点击运行javascript。javascript触发为websocket url (/websocket)创建web套接字,并建立用于实时聊天的连接。但是,我还有另一个按钮"FetchUsers“,用于获取系统中的所有用户。但是对于这个,我需要一个不同的路径(/people)。我不认为我可以使用(/websocket)路径,因为在后端,只有一个函数可以为特定的路径定义。

为了实现这一点,我提出了一个想法,我可以公开两个不同的端口:一个用于rest api,另一个用于web套接字。我的rest api (localhost:8082/people)用于获取系统中的所有用户,而web套接字(localhost:8080/websocket)用于向系统中的所有用户发送聊天消息

我对如何实现聊天应用程序的任何其他建议都持开放态度。

Program.fs

代码语言:javascript
复制
let app : WebPart = 
  choose [
    path "/websocket" >=> handShake ws
    path "/websocketWithSubprotocol" >=> handShakeWithSubprotocol (chooseSubprotocol "test") ws
    path "/websocketWithError" >=> handShake wsWithErrorHandling
    GET >=> choose [ path "/" >=> file "index.html"; browseHome ]
    NOT_FOUND "Found no handlers." ]

let myCfg =
  { defaultConfig with
      bindings = [                        
                   HttpBinding.createSimple HTTP "127.0.0.1" 8080
                   HttpBinding.createSimple HTTP "127.0.0.1" 8082 
                  ]
    }
[<EntryPoint>]
let main _ =
  let personWebPart = rest "people" {
        GetAll = Db.getPeople
        Create = Db.createPerson
    }
  startWebServer myCfg personWebPart
  startWebServer myCfg app

Restful.fs

代码语言:javascript
复制
module RestFul =
    open Suave.Web
    open Suave.Successful
    open Newtonsoft.Json    
    open Suave
    open Suave.Operators
    open Suave.Filters        
    open Suave.Files
    open Suave.RequestErrors
    
    open Newtonsoft.Json.Serialization
    type RestResource<'a> = {
        GetAll : unit -> 'a seq
        Create : 'a -> 'a            
    }

    let fromJson<'a> json =
        JsonConvert.DeserializeObject(json, typeof<'a>) :?> 'a

    let getResourceFromReq<'a> (req : HttpRequest) =
        let getString (rawForm: byte[]) =
            System.Text.Encoding.UTF8.GetString(rawForm)
        req.rawForm |> getString |> fromJson<'a>

    let JSON v =
        let jsonSerializerSettings = JsonSerializerSettings()
        jsonSerializerSettings.ContractResolver <- CamelCasePropertyNamesContractResolver()

        JsonConvert.SerializeObject(v, jsonSerializerSettings)
        |> OK
        >=> Writers.setMimeType "application/json; charset=utf-8"

    let rest resourceName resource =
        let resourcePath = "/" + resourceName
        let getAll = warbler (fun _ -> resource.GetAll () |> JSON)
        
        path resourcePath >=> choose [
            GET >=> getAll
            POST >=> request (getResourceFromReq >> resource.Create >> JSON)
        ]

如何将websocket分配给8080端口,将rest api分配给8082端口?我现在就这么做。服务器在端口上启动,但我只能访问rest url,即localhost:8080/people

代码语言:javascript
复制
startWebServer myCfg personWebPart
startWebServer myCfg app

重申我之前的观点,我想知道如何实现聊天应用程序的任何其他方法。

EN

回答 1

Stack Overflow用户

发布于 2020-12-14 08:27:32

我使用Suave已经有一段时间了,但如果我还记得的话,它支持使用自定义的“WebSocket”计算表达式。在表达式中循环,等待消息,然后处理它。请注意,等待Websocket本身就是一个异步操作,并且每个客户端都有自己的循环。

示例在他们的Github上:https://github.com/SuaveIO/suave/blob/master/examples/WebSocket/Program.fs

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65276798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档