【问题标题】:JSON Feed Appears to be XHR when it should be JSJSON Feed 应该是 JS 时似乎是 XHR
【发布时间】:2011-01-27 21:27:51
【问题描述】:

我不明白为什么它会在第二个提要中这样做(显示为 XHR 调用,而不仅仅是 JS [在 Firefox/Firebug 中查看它])。第二个提要与 Flickr 的 JSON 提要具有完全相同的 MIME 类型,但 PortlandOregon.gov 的一个显示为 XHR,并且在使用 $.getJSON 并且如果我将 $.ajax 与“json”或“jsonp”一起使用时,我会得到一个 NULL 回调类型我什么都得不到。如果我使用 Flickr,我会得到正常的“[object Object]”回调。

怎么了?请帮忙!大约一周以来,这一直令人头疼。而且我有权更改提要,但我必须请求更改,所以如果有人绝对知道,请告诉我!

来自 Flickr API 的响应标头 (http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?) [JS]:

日期 2010 年 3 月 15 日星期一 21:56:06 GMT P3P policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" 到期时间 1997 年 7 月 26 日星期一 05:00:00 GMT 最后修改时间 2010 年 3 月 15 日星期一 21:52:17 GMT Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 杂注无缓存 改变接受编码 内容编码 gzip 内容长度 3647 连接关闭 内容类型应用程序/x-javascript;字符集=utf-8 请求标头 主机 api.flickr.com 用户代理 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 接受 */* Accept-Language en-us,en;q=0.5 接受编码 gzip,deflate 接受字符集 ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活 115 连接保持活动 推荐人 http://oscargodson.com/dev/addWidget/test.html 饼干 BX=4lflj455amesp&b=3&s=iv; fltoto=0%2C0%2C0%2C0%2C1%2C0%3B0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%3B1%3B0%3B;搜索_z=t;本地化=zh-CN%3Bus%3Bus

PortlandOregon.gov (http://www.portlandonline.com/shared/cfm/json.cfm?c=27321) [XHR]:

响应标头 连接关闭 日期 2010 年 3 月 15 日星期一 21:57:49 GMT 服务器 Microsoft-IIS/6.0 Set-Cookie CONTACT_ID=0;path=/LAST_USER=;path=/BIGipServercgis_pol_web_pool-http=1191537418.20480.0000;路径=/ 内容类型应用程序/x-javascript;字符集=utf-8 请求标头 主机 www.portlandonline.com 用户代理 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 接受 application/json, text/javascript, */* Accept-Language en-us,en;q=0.5 接受编码 gzip,deflate 接受字符集 ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活 115 连接保持活动 推荐人 http://oscargodson.com/dev/addWidget/test.html 来源 http://oscargodson.com

【问题讨论】:

  • 是否有波特兰市 API 的 API 参考? API 似乎需要一个参数来传递回调函数名称(类似于 flickr API 中的jsoncallback
  • 不,我们现在正在制作它 :) 我们将如何完成这项工作?我们需要进行哪些更改才能使其正常工作而不是“XHR”请求?

标签: jquery ajax json xmlhttprequest


【解决方案1】:

要让其他人发出 jsonp 请求,您需要检查服务器端是否在请求 url 中有 callback 参数。

例如

/shared/cfm/json.cfm?callback=foo&c=27321

(注意 foo 只是一个示例,它可以是任何类型的字符串,例如 jQuery 使用类似 callback=jsonp1231313123 的东西)

如果是而不是这个

( {"COLUMNS": ...... } )

那么你需要返回这个(回调参数的值必须加在respones前面)

foo( {"COLUMNS": ...... } )

现在您应该可以使用

$.ajaxdatatype: 'jsonp'

$.getJson("http://www.port.../json.cfm?callback=?", {c:'27321'}, somefn)


我怎么能这么说...嗯,你的问题来自于你没有仔细阅读我写的东西。而且(也许?)没有费心去阅读jQuery API documentation 中的段落,因为$.ajax$.getJSON 写了一些关于jsonp 的内容。

  1. http://www.portlandonline.com/shared/cfm/json.cfm?c=27321&callback=test 返回的数据仍然错误(functionreturn 关键字仍然存在)
  2. 你的 url 返回的数据http://kneedeepincode.com/api/test/ 没问题。至少在某种意义上(你不尊重回调参数并且总是返回,好像设置了callback=test。但这对于测试来说是可以的。但是引入了一个微妙的错误,让你认为它不起作用。

    • 您认为即使您的测试站点也不起作用的原因是您说错了。 (跳到答案的末尾,看看一个 script-sn-p 可以很好地加载你的代码。

让我们看看我上面写了什么:

任意使用:

$.ajaxdatatype: 'jsonp' 或使用

$.getJson 并将 callback=? 附加到 url (!NOT callback=test)。

但是在您的测试站点上,您将 callback=test 而不是 callback=? 附加到 url 并使用 $.getJSON。这是行不通的,因为文档非常清楚当您使用 $.getJSON 并真正想要发出 jsonp 请求时您必须做什么。

如果 URL 包含字符串 URL中的"callback=?",请求 被视为 JSONP。见 讨论jsonp 数据类型 $.ajax() 了解更多详情。

当您设置callback=test 时,jQuery 无法识别出您不需要 jsonp 请求而不是 json 请求,因此无法执行您预期的操作。并且只是将 callback=test 视为普通的 get 请求参数而不是 jsonp 回调。

如果您使用$.ajaxdatatype: 'jsonp',jQuery 会自动将callback=jsonp[somenumberhere] 附加到url。

如果你想使用$.getJson,你自己需要将callback=?附加到url(但我重复!NOT callback=test。jQuery将再次处理替换? jsonp[somenumberhere]) 形式的值。

测试站点的工作代码 sn-p:

$(document).ready(function() {
    $.ajax({
        url          : "http://kneedeepincode.com/api/test/",
        dataType     : 'jsonp',
        //normally you wouldn't set the jsonpCallback parameter
        //here I need to do this because your test site acts as if callback=test was set
        jsonpCallback: 'test',
        success      : function(data) {
            $("body").empty();
                for(var i = 0; i < data.COLUMNS.length; i++) {
                $("body").append("<p>"+data.COLUMNS[i]+"</p>");
            }
        }
    });
});

【讨论】:

  • 我现在向管理员请求此更改,如果可行,我会将您标记为正确答案。非常感谢!
  • 我相信他们错误地执行了您的建议(仍然为 NULL):portlandonline.com/shared/cfm/json.cfm?callback=foo&c=27321 他们需要摆脱 JSON 之前的“函数”,对吗?
  • 是的,你是对的。那个是从哪里来的?还没有写过关于添加 function 关键字的单行代码。为什么突然也出现了关键字return??它之前返回的答案是正确的,唯一需要的更改是在没有其他内容的情况下附加回调的值
  • 哈哈。谢谢,我想了很多,但在我要求进行另一次更改之前需要与您确认,但它不起作用:) 好的,我验证这些更改是否已完成,并标记你是正确的哈哈。
  • 嗯,我不明白。他们已经删除它没有工作。我决定将脚本放在我自己的两台服务器上,然后尝试获取 null oscargodson.com/dev/addWidget/test.html 现在有什么想法吗?哈哈
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多