首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HttpClient处理响应值

使用HttpClient处理响应值
EN

Stack Overflow用户
提问于 2021-04-09 15:19:06
回答 2查看 114关注 0票数 0

我正在实现一个使用HttpClient对外部服务进行API调用的服务。特别是其中一个呼叫,并不总是返回预期的相同答案。按惯例:

这是我的决定:

代码语言:javascript
运行
复制
using (HttpClientHandler handler = new HttpClientHandler { Credentials = new NetworkCredential(key, "") })
using (HttpClient client = new HttpClient(handler))
{
    client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
    using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
    {
        using (Stream body = await response.Content.ReadAsStreamAsync())
        {
            using (StreamReader reader = new StreamReader(body))
            {
                string read = string.Empty;
                while (!reader.EndOfStream)
                {
                    read += reader.ReadLine();
                }

                return JsonObject.Parse(read);
            }
        }
    }

这是被截取的响应主体对象:

代码语言:javascript
运行
复制
{
    "id" : 15,
    "key" : "API_KEY",
    "status" : "successful",
    "sandbox" : true,
    "created_at" : "2013-10-27T13:41:00Z",
    "finished_at" : "2013-10-27T13:41:13Z",
    "source_file" : {"id":2,"name":"testfile.pdf","size":90571},
    "target_files" : [{"id":3,"name":"testfile.pptx","size":15311}],
    "target_format" : "png",
    "credit_cost" : 1
}

其中,status参数为successfultarget_files参数为array of objects

然而,有时候,答案基本上是说它还没有完成转换(这个API是一个文件转换服务),使用这种类型的主体:

代码语言:javascript
运行
复制
{
    "id" : 15,
    "key" : "API_KEY",
    "status" : "converting",
    "sandbox" : true,
    "created_at" : "2013-10-27T13:41:00Z",
    "finished_at" : "2013-10-27T13:41:13Z",
    "source_file" : {"id":2,"name":"testfile.pdf","size":90571},
    "target_files" : [{}],
    "target_format" : "png",
    "credit_cost" : 0
}

其中,status参数为converting,而target_files参数为空。

有一种方法可以管理调用,以返回响应的对象,但只在status参数为successfull时才返回?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-12 07:18:36

按照建议,解决轮询请求:(客户端在作用域级别实例化)

代码语言:javascript
运行
复制
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
    using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url))
    {
        TimeSpan delay = default;
        using (HttpResponseMessage response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false))
        {
            if (response.IsSuccessStatusCode)
            {
                using (HttpContent content = response.Content)
                {
                    string data = await content.ReadAsStringAsync().ConfigureAwait(false);
                    JsonValue value = JsonObject.Parse(data);
                    JsonValue status = value["status"] ?? string.Empty;
                    string statusString = status != null ? (string)status : string.Empty;

                    if (!string.IsNullOrEmpty(status) && statusString.Equals("successful", StringComparison.InvariantCultureIgnoreCase))
                        return value;
                }
            }

            delay = response.Headers.RetryAfter?.Delta ?? TimeSpan.FromSeconds(3);
        }

        await Task.Delay(delay);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-04-09 15:35:31

有些apis使用wait=1参数或类似的东西等待。否则,您将不得不投票(可能是一个不同的url)。

详细信息可以从API文档中获得。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67023838

复制
相关文章

相似问题

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