【问题标题】:Retrieving the response from Rest API从 Rest API 检索响应
【发布时间】:2017-05-09 08:11:05
【问题描述】:

我正在创建一个调用其他第三方 API 的 API。第三方 API 是一个 REST API,当我在 Web 浏览器中调用它时,它会返回 JSON 格式的响应

[{"Acc":"IT","Cnt":"023","Year":"16"}]

当我从我的 API 调用第三方 API 时,我试图获得相同的响应。

public IHttpActionResult Get(string acctID) 
{
    using (var client_EndPoint= new HttpClient())
    {
        Uri uri_EndPoint = new Uri(BaseURL_EndPoint);
        client_EndPoint.BaseAddress = uri;
        client_EndPoint.DefaultRequestHeaders.Accept.Clear();
        client_EndPoint.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        string EndPoint_URL = BaseURL_EndPoint+"api/NameCreation?Account="+acctID;
        var response_EndPoint = client_EndPoint.GetAsync(EndPoint_URL).Result;
        string responseString = response_EndPoint.Content.ReadAsStringAsync().Result;
        return Ok(responseString);
    }
}

我一直在做的是从字符串中获取第三方 API 的响应。但我正在检查是否有办法获得 JSON 格式,以便我可以直接返回它们。 get 方法的返回类型为IHttpActionResult。如果我以字符串形式返回,则响应看起来像

"[{\"Acc\":\"adm\",\"Cnt\":\"001\",\"Year\":\"16\"}]"

非常感谢任何帮助。

【问题讨论】:

  • 显示如何返回数据的整个传递方法。发生的事情是json字符串在传递时再次被序列化
  • 方法是public IHttpActionResult Get(string LabName) 我尝试使用return Ok(responseString); 即使返回类似"[{\"Acc\":\"adm\",\"Cnt\":\"001\",\"Year\":\"16\"}]"的响应
  • 看看这里给出的答案stackoverflow.com/a/40836422/5233410
  • 没有其他简单的方法可以做到这一点吗?我得到了结果,但我将不得不采取额外的``
  • 你也可以将其余的 api 结果反序列化为一个具体的类,然后将其传回,然后将其重新序列化为正确的 json

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


【解决方案1】:

您可以使用 Newtonsoft.Json ,只需从 nuget 添加它并将此配置添加到 webapiconfig:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =     
Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

然后使用

return Json(responseString)

【讨论】:

  • 我无法删除 Xml 格式化程序,因为我还从返回 XML 的同一 API 调用其他 api
  • 好的。所以只需添加 json 媒体格式化程序,不要删除 xml。然后使用 return json()
  • 它说json在return json(responseString)的当前contxet中不存在
  • Json 代替 json (我编辑我的回复)。你添加了 Newtonsoft.Json 吗?
【解决方案2】:

创建一个模型来保存 api 数据

public class Model {
    public string Acc { get; set; }
    public string Cnt { get; set; }
    public string Year { get; set; }
}

从 api 反序列化

var response_EndPoint = await client_EndPoint.GetAsync(EndPoint_URL);
var models = await response_EndPoint.Content.ReadAsAsync<Model[]>();

然后返回

return Ok(models);

完整示例

public async Task<IHttpActionResult> Get(string LabName) {

    using (var client_EndPoint = new HttpClient()) {

        //...other code removed for brevity

        var response_EndPoint = await client_EndPoint.GetAsync(EndPoint_URL);
        var models = await response_EndPoint.Content.ReadAsAsync<Model[]>();
        return Ok(models);
    }
}

【讨论】:

  • 感谢 NKosi 的详细解释。但现在问题是返回看起来像 [{"Acc":null,"Cnt":null,"Year":"16"}] 值是 null 它应该是 [{"Acc":"IT"," Cnt":"023","年份":"16"}]
  • 发现问题。这是我这边的错误。非常感谢。
猜你喜欢
  • 2021-11-26
  • 2019-05-13
  • 2021-09-08
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多