【问题标题】:third party API returns httpresponsemessage. can someone help me to understand how to extract data out of httpresponsemessage and return generic type第三方 API 返回 httpresponsemessage。有人可以帮助我了解如何从 httpresponsemessage 中提取数据并返回泛型类型
【发布时间】:2020-09-28 11:56:53
【问题描述】:
public async Task<>GetLandProperty(string num)
{
 var request = new HttpRequestMessage(HttpMethod.Get, _httpClient.BaseAddress+relativeurl);
// added required headers here.
 var response = await _httpClient.SendAsync(request);
}

现在这里的响应是 httpresponsemessage。我不明白如何从响应中提取数据并将其反序列化。也许我可以创建类,获取响应的内容并将其反序列化,但是如果它返回失败响应或异常该怎么办。在这种情况下如何返回泛型类型

【问题讨论】:

  • 您可以在浏览器控制台网络选项卡中看到响应。查看响应的结构,然后相应地工作
  • 是的,但是如果不成功,我应该返回什么。如何返回泛型返回类型
  • 你可以这样返回return StatusCode(StatusCodes.Status500InternalServerError);

标签: c# api asp.net-core web


【解决方案1】:

这与您的 api 代码有关。通过在api端设置HttpResponseMessageHttpStatusCode,可以捕获异常信息并返回不同的信息。

GetLandProperty方法中,可以设置返回类型为object,返回不同的内容。

通过判断响应的IsSuccessStatusCode的状态来判断返回的内容。如果状态为真,则使用反序列化返回的类型,返回对应的对象。如果为false,则直接返回响应。

public async Task<object> GetLandProperty()
    {
        Product product = null;
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("url");
            var request = new HttpRequestMessage(HttpMethod.Get, client.BaseAddress);
            var response = await client.SendAsync(request);
            if (response.IsSuccessStatusCode)
            {
                string responseString = response.Content.ReadAsStringAsync().Result;
                Newtonsoft.Json.Linq.JObject json = Newtonsoft.Json.Linq.JObject.Parse(responseString);
                product = Newtonsoft.Json.JsonConvert.DeserializeObject<Product>(responseString);
                return product;
            }
            return response;

        } 
    }

我的api代码:

   [HttpGet]
    public HttpResponseMessage Get(int id)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        Product persona = _context.Product.FirstOrDefault(p => p.DataID == id);
        if (persona != null)
        {
            response.Content = new StringContent(JsonConvert.SerializeObject(persona));
            response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            return response;
        }
        else
        {
            response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
            response.Content = new StringContent("error message");
            return response;
        }

    }

更新

另一种接收GetLandProperty方法返回内容的方法:

   public async Task<object> CallTest()
        {
            var obj = await GetLandProperty();
            if(obj is Product)
            {
                Product product= (Product)obj;
                // save data to db

            }
            else
            {
                //do other operations
                return obj;
            }


        }

这是邮递员的测试结果:

【讨论】:

  • 非常感谢您的回复。我可以返回对象,但是当我使用这个 GetLandProperty 时,它将返回产品或响应。当它返回产品时,我需要将其存储到数据库中,当它返回响应时,我需要做其他事情,我怎么知道它在消费时返回了什么
  • @Disha,所以你的意思是你有另一种方法来接收GetLandProperty方法返回的内容,以确定是执行存储操作还是其他操作?如果是,you can determine whether the content returned by GetLandProperty is of the Product type,如果是,则执行存储操作,否则执行其他操作。具体操作,我已经更新了我的答案。
  • 只有一个问题,如果第三方api没有返回成功响应,换句话说,假设它返回状态码401和消息“unauthorise”,那么如何处理这种情况?我应该抛出异常吗(如果是,但它可以返回 401 以外的任何内容,该怎么做)。我应该创建自定义异常并抛出,但抛出异常会影响性能吗?或任何其他建议?
  • @Disha,如果你的目的只是为了成功的情况下将数据存入数据库,只要api返回的状态码不是200,那么你可以返回任何你想要的错误信息客户端接收。在CallTest方法中,当obj不能转化为object时(即返回错误信息),直接返回obj,即当前错误信息。我已经更新了我的帖子。
  • 这里,在 CallTest() 方法中,如果 obj 是 Product 类型,则将其保存到数据库中,并且需要返回相同的保存对象。如果 obj 不是产品类型,那么无论我从 GetLandAndProperty() 得到什么响应(状态码 403,reasonPhrase-“禁止”),我都需要使用自定义消息(如状态码 403,消息 - 未订阅。)或如何发送回客户端去做这个?加上这个 callTest 方法由另一个返回 IActionResult 的方法调用(我使用的是 asp.net core 3.1),我无法在函数应用程序中返回状态码。
【解决方案2】:

我不太确定问题是什么。 获取响应数据

  var result = await response.Content.ReadAsStringAsync();

并对其进行贬低

var json= JsonConvert.DeserializeObject<T>(result);

【讨论】:

  • 是的。感谢能够去串音。
猜你喜欢
  • 2013-07-23
  • 2013-02-23
  • 2012-09-19
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多