Как использовать HttpClient из F#?

Я новичок в F# и застрял в понимании асинхронности в F# с точки зрения разработчика C#. Скажем, имея следующий фрагмент в C#:

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

Как написать то же самое в F#?

3 ответов


вот функция, которая должна делать то, что вы ищете (обратите внимание, что вам придется обернуть код в асинхронное вычислительное выражение, чтобы использовать 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
    }

вы захотите, по крайней мере, прочитать и быть в курсе установленных шаблонов в протоколу HTTP.fs Если вы делаете что-нибудь с HttpClient в F#.

[см. комментарии] TL; DR ... но остерегайтесь доли. Как отметил @pimbrouwers, следует отметить, что вы не обязательно есть затем использовать его, Хотя-подстановка и / или развитие вашего собственного набора помощников в вашем контексте может привести вас к более подходящей абстракции (и принести вам преимущества обучение по пути).

к этому моменту: считается идиоматической практикой в F# держать редко используемых и / или чрезмерно конкретных помощников в нецентральном месте.


можно использовать 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
}