【问题标题】:Using Json with Web API and GET requests将 Json 与 Web API 和 GET 请求一起使用
【发布时间】:2016-04-06 13:08:50
【问题描述】:

我有一个返回 json 对象的 Web API 项目。对象已正确填充,但是当调用应用程序接收到它们时,它们是空的。我怀疑这与 Json 被拒绝 GET 请求有关。

我的 API 控制器代码如下所示:

public IHttpActionResult GetThing(string id)
    {
        try
        {
            var model = new Thing(id);
            var res = Json<Thing>(model);
            return res;
        }
        catch
        {
            return NotFound();
        }
    }

此时“res”已正确填充。现在在另一端(客户端)我有:

internal static JsonResult GetThing(string thingId)
    {
        return GetTask<JsonResult>(string.Format(ThingUrl, thingId));
    }

当我在这里检查 JsonObject 的值时,它是空的(数据为空),但我也注意到字段“JsonRequestBehavior”的值是“DenyGet”,我怀疑这是问题所在。

我的问题是,如何将 this 的值设置为“AllowGet”,以便可以使用填充的对象?我正在失去我剩下的一点头发!

【问题讨论】:

  • 代替return res;试试return Ok(res);
  • 确保您的模型具有 DataContract 和 DataMember 属性。
  • 嗨,Kartikeya,我试过使用 Ok(res),但结果是一样的,客户端收到一个空对象。

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


【解决方案1】:

您不需要在控制器中将对象转换为 JSON。您应该能够让您的控制器代码如下所示:

public Thing Get(string id)
{
    try
    {
        var model = new Thing(id);           
        return model;
    }
    catch
    {
        //throw not found exception
    }
}

然后,当您发出请求时,请确保已设置 Accept: application/json 标头,并且您应该是黄金。

编辑:根据您的评论,以及实际使请求不可见的代码,我只能假设您为调用 API 端点而编写的代码一定是不正确的。

它应该看起来像这样:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("BaseUrlOfAPI");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    

    HttpResponseMessage response = await client.GetAsync("realtiveurltocontroller/thingid");
    if (response.IsSuccessStatusCode)
    {
        Thing thing = await response.Content.ReadAsAsync<Thing>();
        // Do whatever you want with thing.
    }
}

可以在here找到更多信息

【讨论】:

  • 嘿大卫,你是对的 JsonRequestBehavior 只在 MVC 中。感谢您的提示!
  • 我已经使用 httpClient.DefaultRequestHeaders.Add("Accept", "application/json");但问题仍然存在。
  • @Faithypop 我添加了一些额外的信息和一个指向更多示例的链接供您查看。
  • @DrewJordan 没问题。今天花了大约 30 分钟试图证明自己是错的 :)
  • @Faithypop 这就是我来这里的目的:)
猜你喜欢
  • 2010-10-30
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多