从返回的HttpResponseMessage中获取JSON的API值

8

我创建了一个控制器和方法,用于从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();
        }
    }

The response i get looks like:

{
  "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",我可以得到精确的数据。 我错过了什么吗?


2
你不想序列化整个响应,只需要response.Content。但在这种情况下它是空的,显然还有其他问题... - Charles Mager
你可以尝试访问https://dev59.com/HmUo5IYBdhLWcg3wkQNq#15936272。 - LarsH
当我使用response.Content时,我得到了这个值: {"Headers":[{"Key":"Content-Length","Value":["359"]},{"Key":"Content-Type","Value":["application/json; charset=utf-8"]},{"Key":"Expires","Value":["-1"]}]} - etrupja
你正在从API返回整个HTTP响应。你想要对XML响应做什么?将其转换为JSON并返回吗? - CodeCaster
@CodeCaster 是的,完全正确。 - etrupja
1个回答

7
你需要提取响应的主体并返回它。
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
哦,没错,我没有阅读 OP 的序列化 HTTP 响应,我只看了示例 XML。 - CodeCaster
@CodeCaster 我认为 XML 只是返回数据的一种表示形式。头部显示返回的是 JSON。 - Nkosi
我现在得到的数据是正确的,但格式不正确: "{"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}" - etrupja
@Nkosi 没问题。感谢您的时间。 - etrupja
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接