【问题标题】:Jquery.ajax GET not ending parametersJquery.ajax GET 不结束参数
【发布时间】:2017-02-16 22:15:13
【问题描述】:

我正在为公司 Intranet 上的内容制作区域创建 UI。我在之前的项目中创建了中间件 API。这是我第一次使用 RESTful 方法(首先我对 Javascript 和 jquery 还很陌生)

当我从 jquery.ajax 调用我的调试本地 api 时,JSON 对象没有在我的 GET 方法上正确传递。

在 C# API 中

[ActionName("THING")]
        [HttpGet()]
        public string GetThing(object json)
        {
            GetData getData;
            if (json == null)
                return null;
            else if (json is string && (json as string).StartsWith("{"))
                getData = JsonConvert.DeserializeObject<GetData>(json as string);
            else
                return null; 
            ItemReturn retVAl = new ItemReturn();

[logic to use JSON]

return retVal;

在网页中

loadThings: function (thingNumber, showBool) {
                showBool = (showBool === true);
                $.ajax({
                    type: "GET",
                    dataType: "json",
                    data: '{ "GetData" : {"ThingNumber":"' + thingNumber + '","Show": ' + showBool + '}}',
                    url: "http://localhost:11422/api/THING/THING/GetThing",
                    contentType: "application/json; charset=utf-8",

                    success: function (result) {

[logic to display things]

}

我可以很好地在 GetThing 中击中我的断点,一切正常,但我似乎无法弄清楚为什么我的重载中的对象 (json) 为空。我知道这是 javascript 中的东西,我的单元测试工作正常,我的 JavaScript 让我到达方法中的断点,我只需要重载 JSON 对象即可实际传入

更新

它在 api 端。我将 GetThing 的重载从 (object json) 更改为 ([FromUri()] object json)。这解决了眼前的问题,但它目前只是将 JSON 对象转换为空白对象

++注意:我必须将我的 post 方法重载更改为 [FromBody()] 而不是 [FromUri()],我还没有更新 DELETE 方法以查看使用哪个方法

【问题讨论】:

  • 您在ajax 请求中的data 是一个字符串。将其更改为 js 对象。或者使用JSON.stringify,然后在服务器上解析。

标签: javascript c# jquery json ajax


【解决方案1】:

所以问题 1,你不能用 GET 做到这一点。两种选择

  1. 使用 POST
  2. 字符串化并使用 GET

1) 这就是你使用 POST 的方式

按如下方式修复您的 ajax 请求:

$.ajax({
  type: "POST",
  dataType: "json",
  data: { "GetData" : {"ThingNumber": thingNumber ,"Show": showBool }}, // JS object not string
  url: "http://localhost:11422/api/THING/THING/GetThing",
  contentType: "application/json; charset=utf-8",

请阅读$.ajax 发布文档以获取说明https://api.jquery.com/jquery.post/

2) 使用 GET

var obj = JSON.stringify({ "GetData" : {"ThingNumber": thingNumber ,"Show": showBool }}),
    url = "http://localhost:11422/api/THING/THING/GetThing?json=" + encodeURIComponent(obj);

$.ajax({
      type: "GET",
      dataType: "json",
      url: url, // Here we encode the obj for server
      contentType: "application/json; charset=utf-8",

如果您使用此方法,则必须更改控制器以将 json 参数设为 String,然后使用您选择的库将其解析为 JSON。 How can I parse JSON with C#?

【讨论】:

  • 好的,我需要返回数据,这个函数似乎适合 GET,当我将它作为 POST 时,它甚至没有连接到我的 API,给我一个 500 错误。现在我将它作为获取我唯一的问题是数据不起作用。我确实根据您之前的建议从字符串更改为 JSON.stringify({ "GetData" : {"ThingNumber": thingNumber ,"Show": showBool​​ }}) 但我不明白为什么我必须使用 POST 而不是 GET .特别是因为我有另一个 POST 功能,只有 GET 工作。
  • 除了从字符串更改数据并且您将表单 POST 更改为 GET 之外的所有内容看起来都一样,我是否遗漏了什么?有没有办法将数据传递给 GET 函数?
  • 不,你不能将数据作为对象传递给GET 方法,GET 只能发送字符串。
  • @davidp04 查看我的编辑我也添加了使用 GET 的方法。我仍然建议您使用POST,因为框架会为您完成转换,这似乎更容易。但是如果你想手动进行字符串化和解析,请继续使用GET,它仍然有效
  • 哦,我明白了,这很有道理。
【解决方案2】:

您可以尝试在 ajax 设置中添加:traditional:true,

【讨论】:

  • 我没有尝试过(也不知道那个设置是什么),但似乎问题实际上出在 api 方面
猜你喜欢
  • 2016-12-25
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多