7

Sono nuovo di F # e sono bloccato nella comprensione asincrona in F # dal punto di vista di uno sviluppatore C#. Supponiamo di avere il seguente frammento in C#:Come utilizzare HttpClient da F #?

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

Come scrivere lo stesso in F #?

risposta

14

Ecco una funzione che dovrebbe fare quello che stai cercando (notare che dovrete inserire il codice in un'espressione di calcolo asincrono al fine di utilizzare il diamo sintassi):!

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 
    } 
+2

non dovrebbero i primi due 'let' s essere 'use's invece? (httpClient e risposta essendo IDisposable) – Cogwheel

6

È possibile utilizzare 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 
} 
6

probabilmente vorrete usare Http.fs se si sta facendo qualcosa con HttpClient in F #.