如何从F#中使用HttpClient?

时间:2014-10-04 17:11:52

标签: f# task-parallel-library async-await dotnet-httpclient c#-to-f#

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

var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();

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

5 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:7)

如果您在F#中使用HttpClient执行任何操作,您至少应该阅读并了解Http.fs中已建立的模式。

[见评论] TL; DR ...... but Beware the Share。正如@pimbrouwers所指出的,应该注意的是,你不一定 然后使用它 - 在你的上下文中对你自己的帮助器进行子集化和/或演化可以使你更好地拟合抽象(并在途中为您带来学习的好处)。

到目前为止:F#中的惯用做法是将非常使用和/或过度具体的助手保留在非中心位置。

答案 2 :(得分: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
}

答案 3 :(得分:1)

我只有两美分。但是我的理解是,使用HttpRequestException时应该处理EnsureSuccessStatusCode()

下面是包装HttpClient的模块的开始,该模块将URL的响应缓冲到string中,并安全地包装在Result<'a, 'b>中,以提高容错能力。

module Http =
    open System    
    open System.Net.Http

    let getStringAsync url =
        async {
            let httpClient = new HttpClient() 
            // This can be easily be made into a HttpClientFactory.Create() call
            // if you're using >= netcore2.1

            try 
                use! resp = httpClient.GetAsync(Uri(url), HttpCompletionOption.ResponseHeadersRead) |> Async.AwaitTask                       
                resp.EnsureSuccessStatusCode |> ignore

                let! str = resp.Content.ReadAsStringAsync() |> Async.AwaitTask
                return Ok str
            with
            | :? HttpRequestException as ex -> return ex.Message |> Error
        }

答案 4 :(得分:0)

只需使用FSharp.Control.FusionTasks,您将获得清晰的语法,而无需使用|> Async.AwaitTask

   let httpClient = new System.Net.Http.HttpClient ()

   let getAsync (url:string) = 
    async {
        let! response = httpClient.GetAsync url
        response.EnsureSuccessStatusCode () |> ignore
        let! content = response.Content.ReadAsStringAsync ()
        return content
    }