首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从F#消费HttpClient?

如何从F#消费HttpClient?
EN

Stack Overflow用户
提问于 2014-10-05 01:11:52
回答 4查看 5.2K关注 0票数 11

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

代码语言:javascript
复制
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();

如何在F#中编写相同的代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-05 01:29:14

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

代码语言:javascript
复制
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
    }
票数 19
EN

Stack Overflow用户

发布于 2014-10-05 01:28:59

您可以使用async

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-27 21:25:05

这只是我的两个观点。但我的理解是,在使用EnsureSuccessStatusCode()时,我们应该处理HttpRequestException

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

代码语言:javascript
复制
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
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26195133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档