【问题标题】:Managing HttpClient in a F# WebAssembly app在 F# WebAssembly 应用程序中管理 HttpClient
【发布时间】:2021-06-20 11:12:12
【问题描述】:

最佳实践是在一个地方“注册”http 客户端,以便可以从这个 Elmish 更新功能中重用它?不必为每个请求都创建它。

let update message model =
    match message with
    | SetMessage s -> { model with x = s }
    | Loading -> { model with x = "Doing something long ..." }

let handleClick model dispatch _ = 
    dispatch Loading
    async {
        let url = Uri "https://api.github.com"
        -- FIXME: too expensive to do this on per-update basis
        use httpClient = new HttpClient(BaseAddress = url)
        let! resp = httpClient.GetAsync "/users/srid" |> Async.AwaitTask
        let! s = resp.Content.ReadAsStringAsync() |> Async.AwaitTask
        dispatch (SetMessage s)
    } |> Async.Start

我觉得这通常会出现在 Startup.fs 中。我使用仅限客户端的 Bolero Web 应用程序,所以它看起来像:

 builder.Services.AddSingleton<HttpClient>(new HttpClient (BaseAddress=apiBase))

但是问题变成了......我如何从我的 F# 程序中访问它?什么是惯用方式?

【问题讨论】:

    标签: f# dotnet-httpclient bolero


    【解决方案1】:

    可能最好的方法是将 HttpClient 添加为模型中的另一个字段或作为更新函数的另一个参数。

    let update (client:HttpClient) message model = // Your code
    
    let url = Uri "https://api.github.com"
    let httpClient = new HttpClient(BaseAddress = url)
    

    一般来说,您不应该在您的视图中“做工作”,进而扩展事件处理程序。相反,您应该使用类似这样的 Elmish Cmd module

    let update httpClient message model =
        match message with
        | SetMessage s -> 
            { model with x = s }, Cmd.none
        | GetMessageAsync -> 
            let cmd = 
                let getHttp () = 
                    async {
                        let! resp = httpClient.GetAsync "/users/srid" |> Async.AwaitTask
                        return! resp.Content.ReadAsStringAsync() |> Async.AwaitTask
                    }
                Cmd.OfAsync.perform getHttp () (fun s -> SetMessage s)
    
            { model with x = "Doing something long ..." }, cmd
    
    let handleClick model dispatch _ = 
        dispatch GetMessageAsync
    

    【讨论】:

    • 是的,这是有道理的 - 回复:Cmd。我选择了Cmd.OfAsync.either,因为它处理异常。另外,我将 HttpClient 作为注册服务放入Startup.fsgithub.com/srid/fsharp-wasm-static-demo
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2021-08-02
    • 2022-11-19
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多