【问题标题】:Handling response values using HttpClient使用 HttpClient 处理响应值
【发布时间】:2021-04-09 15:19:06
【问题描述】:

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

这是我的电话:

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);
            }
        }
    }

这是方面的响应主体对象:

{
    "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 是一个文件转换服务),具有这种类型的主体:

{
    "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 参数为convertingtarget_files 参数为空。

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

【问题讨论】:

    标签: c# asp.net-mvc dotnet-httpclient api-management


    【解决方案1】:

    有些 api 采用 wait=1 参数或类似的等待。否则,您必须 poll(可能是不同的 url)。

    您的 API 文档中应提供详细信息。

    【讨论】:

      【解决方案2】:

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

      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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        相关资源
        最近更新 更多