Как использовать 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
}