【问题标题】:Get the API value from the JSON returned in a HttpResponseMessage从 HttpResponseMessage 中返回的 JSON 中获取 API 值
【发布时间】:2016-11-25 03:24:18
【问题描述】:

我创建了一个控制器和方法,用于从 API 获取数据。 我使用HttpResponseMessage 来获得回复。一切正常,但我无法以 JSON 格式获得我想要的确切数据。
方法如下:

public class TestController : ApiController
    {
        [HttpGet]

        public async Task<IHttpActionResult> TestMethod(...)
        {
            string _apiUrl = String.Format("...");
            string _baseAddress = "...";

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(_baseAddress);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = await client.GetAsync(_apiUrl);


                if (response.IsSuccessStatusCode)
                {
                    return Json(response);
                }
            }
            return NotFound();
        }
    }

我得到的响应如下:

{
  "Version": {
    "Major": 1,
    "Minor": 1,
    "Build": -1,
    "Revision": -1,
    "MajorRevision": -1,
    "MinorRevision": -1
  },
  "Content": {
    "Headers": [
      {
        "Key": "Content-Length",
        "Value": [
          "359"
        ]
      },
      {
        "Key": "Content-Type",
        "Value": [
          "application/json; charset=utf-8"
        ]
      },
      {
        "Key": "Expires",
        "Value": [
          "-1"
        ]
      }
    ]
  },
  "StatusCode": 200,
  "ReasonPhrase": "OK",
  "Headers": [
    {
      "Key": "Pragma",
      "Value": [
        "no-cache"
      ]
    },
    {
      "Key": "X-SourceFiles",
      "Value": ["..."
      ]
    },
    {
      "Key": "Cache-Control",
      "Value": [
        "no-cache"
      ]
    },
    {
      "Key": "Date",
      "Value": [
        "Thu, 21 Jul 2016 13:25:54 GMT"
      ]
    },
    {
      "Key": "Server",
      "Value": [
        "Microsoft-IIS/10.0"
      ]
    },
    {
      "Key": "X-AspNet-Version",
      "Value": [
        "4.0.30319"
      ]
    },
    {
      "Key": "X-Powered-By",
      "Value": [
        "ASP.NET"
      ]
    }
  ],
  "RequestMessage": {
    "Version": {
      "Major": 1,
      "Minor": 1,
      "Build": -1,
      "Revision": -1,
      "MajorRevision": -1,
      "MinorRevision": -1
    },
    "Content": null,
    "Method": {
      "Method": "GET"
    },
    "RequestUri": "...",
    "Headers": [
      {
        "Key": "Accept",
        "Value": [
          "application/json"
        ]
      }
    ],
    "Properties": {}
  },
  "IsSuccessStatusCode": true
}

但通常情况下,API 返回此值(xml 格式):

<License>
  <Existing>
    <Amount>0</Amount>
    <Quantity>0</Quantity>
    <UnitAmount>0</UnitAmount>
  </Existing>
<New>
   <Amount>400</Amount>
   <Quantity>50</Quantity>
   <UnitAmount>8</UnitAmount>
</New>
<Result>
   <Amount>400</Amount>
   <Quantity>50</Quantity>
   <UnitAmount>8</UnitAmount>
</Result>
</License>
   <PartnerDiscount i:nil="true"/>
</CalculatorResult>

如何从 API 请求中提取这些值。如果我从 API 响应中执行 "RequestUri",我会得到准确的数据。 我错过了什么?

【问题讨论】:

  • 您不想序列化整个响应,只需序列化 response.Content。显然,在这种情况下它是空的,所以其他东西也一定是错的......
  • 当我使用 response.Content 我得到这个值:{"Headers":[{"Key":"Content-Length","Value":["359"]},{"Key ":"Content-Type","Value":["application/json; charset=utf-8"]},{"Key":"Expires","Value":["-1"]}]}
  • 您正在从 API 返回整个 HTTP 响应。您究竟想对 XML 响应做什么?将其转换为 JSON 并返回?
  • @CodeCaster 是的,完全正确。

标签: c# json xml asp.net-mvc httpresponse


【解决方案1】:

您需要提取响应的正文并返回

public class TestController : ApiController
{
    [HttpGet]
    public async Task<IHttpActionResult> TestMethod(...)
    {
        string _apiUrl = String.Format("...");
        string _baseAddress = "...";

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(_baseAddress);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var responseMessage = await client.GetAsync(_apiUrl);

            if (responseMessage.IsSuccessStatusCode)
            {
                var response = Request.CreateResponse(HttpStatusCode.OK);
                response.Content = responseMessage.Content;
                return ResponseMessage(response);
            }
        }
        return NotFound();
    }
}

这是使用ExpandoObject 的另一个选项。

if (responseMessage.IsSuccessStatusCode)
{
    var data =  await responseMessage.Content.ReadAsAsync<ExpandoObject>(); 
    return Json(data);
}

【讨论】:

  • 响应是 XML。您不想返回 JSON 编码的 XML 字符串。
  • @CodeCaster 你不知道这一点。请求标头要求 JSON。
  • 哦对了,我没有看OP的序列化HTTP响应,我只看了示例XML。
  • @CodeCaster 我相信 xml 只是返回数据的表示。标头说它是返回 json。
  • 我现在得到的数据是正确的数据但是格式不对:"{\"License\":{\"New\":{\"Quantity\":50.0,\" UnitAmount\":8.0,\"Amount\":400.0},\"Existing\":{\"Quantity\":0.0,\"UnitAmount\":0.0,\"Amount\":0.0},\"Result \":{\"Quantity\":50.0,\"UnitAmount\":8.0,\"Amount\":400.0}},\"ContractPerYear\":null,\"ContractMonth\":null,\"ContractDay\ ":null,\"Contract\":null,\"ExistingLicenseDiscount\":null,\"ContractDiscount\":null,\"PartnerDiscount\":null,\"Discount\":null}"
猜你喜欢
  • 2013-09-18
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2020-11-05
相关资源
最近更新 更多