我有一个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
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 appRestful.fs
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
startWebServer myCfg personWebPart
startWebServer myCfg app重申我之前的观点,我想知道如何实现聊天应用程序的任何其他方法。
发布于 2020-12-14 08:27:32
我使用Suave已经有一段时间了,但如果我还记得的话,它支持使用自定义的“WebSocket”计算表达式。在表达式中循环,等待消息,然后处理它。请注意,等待Websocket本身就是一个异步操作,并且每个客户端都有自己的循环。
示例在他们的Github上:https://github.com/SuaveIO/suave/blob/master/examples/WebSocket/Program.fs
https://stackoverflow.com/questions/65276798
复制相似问题