gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:58:17 24 4
gpt4 key购买 nike

我有一个 f# 聊天应用程序,它需要公开休息 api 以及用于实时消息传递的 websocket。我正在使用 Suave 框架。
我有一个前端,它有一个“聊天”按钮,可以在点击时运行 javascript。 javascript 触发为 websocket url (/websocket) 创建一个 web socket,并为实时聊天建立连接。但是,我还有另一个按钮“FetchUsers”用于获取系统中的所有用户。但为此,我需要不同的路径(/people)。我不认为我可以使用 (/websocket) 路径,因为在后端,只能为特定路径定义一个函数。
为了实现这一点,我提出了一个想法,我可以公开 2 个不同的端口:一个用于其余 api,另一个用于 Web 套接字。我的 rest api (localhost:8082/people) 用于获取系统中的所有用户,而 web sockets (localhost:8080/websocket) 用于向系统中的所有用户发送聊天消息
我愿意接受有关如何实现聊天应用程序的任何其他建议。
程序文件

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
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 并将其余 api 分配到端口 8082?我现在正在这样做。服务器在端口上启动,但我只能访问其余的 url,即 localhost:8080/people
startWebServer myCfg personWebPart
startWebServer myCfg app
重申我之前的观点,我想知道关于如何实现聊天应用程序的任何其他方法。

最佳答案

自从我使用 Suave 已经有一段时间了,但如果我记得它使用自定义“套接字”计算表达式支持 WebSocket。您在表达式中循环,等待消息,然后处理它。请注意,等待 Websocket 本身就是一个异步操作,每个客户端都有自己的循环。
示例在他们的 Github 上:
https://github.com/SuaveIO/suave/blob/master/examples/WebSocket/Program.fs

关于rest - Suave with f# - 如何在 f# 聊天应用程序中使用 rest api 和 websocket 端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65276798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com