【问题标题】:Why does this $.getJSON request error?为什么这个 $.getJSON 请求错误?
【发布时间】:2012-04-27 14:05:20
【问题描述】:

我有以下调用 http 处理程序的脚本。它调用 http 处理程序,在 fiddler 中,我可以看到正确返回的 JSON,但是这个脚本总是以错误块结尾。如何确定问题所在?

    <script type="text/javascript">
        function GetConfig() {
            $.getJSON("http://localhost:27249/Handlers/GetServiceMenuConfiguration.ashx", function(d) {
                alert("success");
            }).success(function(d) {
                alert("success");
            }).error(function(d) {
                alert("error");
            }).complete(function(d) {
                alert("complete");
            });
        }
    </script>

【问题讨论】:

  • 您能提供回邮给我们吗?并且回发是有效的 JSON 吗?回帖等的标题会很好。
  • 使用 JSONLint 并检查返回的 JSON 格式是否正确
  • 您的错误处理程序获取三个参数,其中两个对于找出错误是有用的。它们显示了什么?
  • @T.J.Crowder 我看不到有用的信息,我应该看什么 arg?
  • @MrShoubs:错误函数获取the documentation 中描述的三个参数:jqXHR, textStatus, errorThrown。第一个只是 jQuery XHR 对象。第二个和第三个通常提供更多信息。

标签: javascript jquery json getjson


【解决方案1】:

我看到您包含了服务器名称 (localhost) 和端口 (27249)。 Ajax 请求由Same Origin Policy 控制,正常情况下禁止跨域请求。 (如果您不进行跨域调用,则不需要在 URL 中包含 http://localhost:27249 部分,这让我认为您可能会这样做。)

如果浏览器支持跨域调用并且您的服务器代码正确处理了CORS 请求,您就可以进行跨域调用。或者,您可以考虑使用JSON-P

【讨论】:

  • 我假设在本地主机上运行的处理程序和站点都将被视为同一个域 - 你提到了起源。我会将网页与处理程序放在同一个项目中。这是我做过的第一个网络开发。曾经。 (通常是 .net 开发人员)
  • @MrShoubs:除了同一个域,AJAX 调用也需要在同一个端口上。
  • 谢谢@Rocket,我发现有很多事情让我抓狂。
  • @MrShoubs:Origindomain 不同。不同的端口有不同的来源(正如不同的协议——httphttps——甚至不同的子域,尽管这更容易放松)。详情见链接。
【解决方案2】:

JQuery 的内置 JSON 解析器相当挑剔,如果标头设置不完美,即使格式良好的 JSON 有时也会失败。首先尝试使用 type:text 属性执行 $.ajax 请求并记录响应。这将区分连接问题和解析问题。

$.ajax({
  dataType:'text',
  url: '/Handlers/GetServiceMenuConfiguration.ashx',
  success: function(data) {
      console.log(data.responseText);
  }
});

如果问题在于连接,并且您确实需要跨域请求 JSON,那么您也可以使用 LAB、yep/nope 或 Frame.js 等库加载器。

【讨论】:

  • “JQuery 的内置 JSON 解析器相当挑剔,如果标头设置不完美,即使格式良好的 JSON 有时也会失败” 不。格式良好的 JSON 将解析如果你告诉 jQuery 它是 JSON。您可以通过以下两种方式之一执行此操作: 1. 返回正确的 Content-Type 标头。 2. 告诉 jQuery 你期待 JSON 返回(通过dataType 选项),在这种情况下它将忽略Content-Type 标头。
  • 感谢您的 cmets TJ,我非常尊重您的意见,但里程可能会有所不同。有很多东西可能在服务器上配置不正确,导致 $.getJSON 甚至无法解析格式良好的 JSON。这就是为什么同样的问题一次又一次出现的原因之一。
  • @Bishop:你能指点我其中一个吗?因为坦率地说,我从来没有听说过这样的事情。我看到 很多 人询问 JSON 错误,他们几乎总是归结为 JSON 格式错误、SOP 或调用不正确。
  • 您提到了一个:Content-Type 标头。我猜其他标头也可能会断开连接。不正确的字符编码/转义可能会使 JSON 在服务器上看起来格式正确,但会导致 JSON 解释器失败。根据您使用的服务器产品(例如冷融合),响应可能会在前面添加安全字符串以防止网络钓鱼。这不会出现在服务器端,但会导致 JSON 失败。一些服务器不能正确处理 JSON 中的 HTML 内容,因此错误可能是间歇性的,具体取决于 JSON 的内容。
  • @Bishop:好的,编码可能是个问题,尽管你必须非常不幸,它才会真正导致解析失败。从客户端的角度来看,预先处理的事情或服务器端故障处理 HTML 都被视为格式不正确的 JSON。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多