如何从F#中使用HttpClient?

aba*_*hev 11 f# task-parallel-library c#-to-f# async-await dotnet-httpclient

我是F#的新手,从C#开发人员的角度来理解F#中的异步.假设在C#中使用以下代码段:

var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

如何在F#中写相同的内容?

Mic*_*sox 18

这是一个应该执行您正在寻找的函数(请注意,您必须将代码包装在异步计算表达式中才能使用let!语法):

let getAsync (url:string) = 
    async {
        let httpClient = new System.Net.Http.HttpClient()
        let! response = httpClient.GetAsync(url) |> Async.AwaitTask
        response.EnsureSuccessStatusCode () |> ignore
        let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
        return content
    }
Run Code Online (Sandbox Code Playgroud)

  • 不应该前两个`让我们'用's代替?(httpClient和响应是IDisposable) (4认同)

Rub*_*ink 7

如果你在F#中做任何事情,你至少要阅读并了解Http.fs中已建立的模式HttpClient.

[见评论] TL; DR ...... 但要注意分享.正如@pimbrouwers指出,应该注意的是,你不一定,虽然以再使用它-子集和/或进化自己的一组助手在你的环境可以带你到一个更好的拟合抽象(并为您带来的好处在途中的学习).

到目前为止:在F#中考虑惯用法是在非中心位置保留很少使用和/或过度特定的助手.


Lee*_*Lee 6

你可以使用async:

let readString (url: Uri) = async {
    let httpClient = new HttpClient();
    let! response = httpClient.GetAsync(url) |> Async.AwaitTask
    response.EnsureSuccessStatusCode() |> ignore
    return! response.Content.ReadAsStringAsync() |> Async.AwaitTask
}
Run Code Online (Sandbox Code Playgroud)