【问题标题】:Can not get json response using $.getJSON无法使用 $.getJSON 获得 json 响应
【发布时间】:2011-02-13 15:11:02
【问题描述】:

我目前正在开发一个 Ruby on rails 3 应用程序。

我的服务器控制器函数渲染一个 json 对象作为响应:

class DaysController < BaseController
   ...
   def the_days
     ...
     render :json => days
   end
end

在我的 javascript 中,我使用以下代码从服务器获取 json 响应(来自控制器中的 the_day 函数)

$.getJSON(  
             url,  
             {emp_id: emp_id},
             function(data) {
                     var result = data.response;
                     alert(result) 
                     alert(data)
                 },
                 "json"
        );

我使用 firefox 浏览器并使用 Firebug 检查,在 Firebug Net->XHR 中,我看到 Get 请求成功,并且响应“days”在那里。那就是请求和响应都成功了。

但是我没有看到上面$.getJSON函数中定义的两个警报窗口,为什么?为什么我在$.getJSON 函数中得不到响应“days”??

-----------------已编辑------------------

我将我的代码编辑为这个:

$.ajax({
            url: myURL,

            type: 'GET',

            data: {
                emp_id: emp_id
            },

            dataType: "json",

            success: function(data) {
                alert("hi");
                alert(data)
            }
        });

当我运行这段代码时,浏览器卡在success: function(data)

【问题讨论】:

    标签: javascript jquery ruby-on-rails json ruby-on-rails-3


    【解决方案1】:

    如果data 回来null,但响应成功,我会说您发送请求的方式违反了Same Origin Policy

    请求需要发送到为原始页面提供服务的同一主机/端口/协议。

    如果这只是您的开发环境中的一个问题,您可以在 Chrome 中进行测试,方法是使用 --disable-web-security 从终端应用程序启动它。


    编辑:尝试将参数名称从 data 更改为其他名称,例如 dat 或其他名称。

    然后尝试警报:

    alert( dat );
    

    我听说一些浏览器在使用 AJAX 调用的 data 属性时遇到 data 参数问题。

    【讨论】:

    • @Mellon:那是 only 警报吗?使回调尽可能简单。试试alert('test')。如果可以,请发布更多信息。
    • 嗨,即使 alert('test') 没有弹出...顺便说一句,'days' 是一个字符串
    • @Mellon:我看到了你的更新。您是否尝试将data 更改为其他内容?控制台中是否有任何错误?尝试将dataType 更改为text
    【解决方案2】:

    我猜问题是data 没有响应属性。尝试只提醒data 变量。它应该是 days 对象本身。

    【讨论】:

    • +1 我认为这更有可能。我错过了 ' 并且响应“天”在那里' 部分。同时,我认为在这种情况下仍然会出现警报。提供的信息很难说。
    • "The response days is there"意思是在firefox浏览器的Firebug工具中,我看到响应消息是控制器返回的"days",即响应成功。
    • @Mellon - 文档表明 getJSON 只需要三个参数,第二个是可选的。如果去掉类型参数"json"会发生什么?
    • 嗨 tvansosson,我删除了“json”参数,但没有任何反应
    【解决方案3】:

    我希望我可以发表评论,但我想我还没有访问权限。

    无论如何,我会从更基本的东西开始。添加一些文本警报只是为了确保您确实到达了您认为的位置。即...

    $.getJSON(  
                 url,  
                 {emp_id: emp_id},
                 function(data) {
                         alert('hi')  // add this
                         var result = data.response;
                         alert('bye') // add maybe even this
                         alert(result) 
                         alert(data)
                     },
                     "json"
            );
    

    有时当我在调试时,我发现即使是我最基本的假设也是错误的。

    编辑:这是我最近实现的工作代码中的一些示例代码

    $.ajax({
            url: 'users/check_username',
            type: 'GET',
            data: {
              username: username
            },
            dataType: "json",
            success: function(user_exists) {
              alert(user_exists)      // CHANGE THIS PART
            }
          });
    

    【讨论】:

    • 嗨,你是对的,我试过你的代码,甚至警报('hi')都没有弹出......我想知道为什么??
    • 我正在编辑我的帖子以包含我最近使用的工作代码。现在检查一下。我得走了,但我稍后再回来看看。
    • 根据您在编辑帖子中的代码,我修改了我的代码,但它卡在“成功:函数(user_exists)”。请参阅上面我编辑的帖子。
    • 好的,我将再次编辑代码。这是我正在使用的代码的直接剪切/粘贴,因为我很着急。
    • 只需编辑success: function(user_exists) 部分,在此处添加警报。
    【解决方案4】:

    听起来您没有在 ruby​​ 应用程序中发送正确的标头。 Firebug 应该将响应 Content Type 报告为 application/json,因为这是 jquery 所期望的。

    您可以尝试将 ajax 调用中的 datatype 更改为 html 以查看您的 alerts 是否可以使用它,但这对 json 解析没有帮助。

    【讨论】:

    • 在萤火虫响应中显示“Accept application/json, text/javascript, /;”
    • 如果它说“accept”那不是响应头,那就是请求头。
    【解决方案5】:

    终于,我找到了根本原因。原因很简单,因为服务器返回了“Invalid json data”。那是在 Rails 控制器功能'def the_days'中:

    render :json => days
    

    应该修改为

    render :json => days.to_json
    

    然后,一切顺利:)无论如何,谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多