它应该是JS时,JSON Feed似乎是XHR

时间:2010-03-15 22:11:53

标签: jquery ajax json xmlhttprequest

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

怎么回事?请帮忙!这一直是一个令人头疼的问题,大约一个星期。我有权更改Feed,但我必须要求更改,所以如果有人知道绝对确定让我知道!

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

Date    Mon, 15 Mar 2010 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"
Expires Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified   Mon, 15 Mar 2010 21:52:17 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache
Vary    Accept-Encoding
Content-Encoding    gzip
Content-Length  3647
Connection  close
Content-Type    application/x-javascript; charset=utf-8
Request Headers
Host    api.flickr.com
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept  */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://oscargodson.com/dev/addWidget/test.html
Cookie  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; search_z=t; localization=en-us%3Bus%3Bus

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

Response Headers
Connection  close
Date    Mon, 15 Mar 2010 21:57:49 GMT
Server  Microsoft-IIS/6.0
Set-Cookie  CONTACT_ID=0;path=/ LAST_USER=;path=/ BIGipServercgis_pol_web_pool-http=1191537418.20480.0000; path=/
Content-Type    application/x-javascript; charset=utf-8
Request Headers
Host    www.portlandonline.com
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept  application/json, text/javascript, */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://oscargodson.com/dev/addWidget/test.html
Origin  http://oscargodson.com

1 个答案:

答案 0 :(得分:1)

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

e.g。

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

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

如果是,则代替此

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

然后你需要返回它(必须在响应前面添加回调参数的值)

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. 您的网址返回的数据http://kneedeepincode.com/api/test/没问题。至少在某种意义上说(你不尊重回调参数并且总是像设置callback=test一样返回。但是这可以用于测试。但是引入了一个微妙的错误,让你认为它不起作用。

    • 你认为即使你的测试网站不起作用的原因是你说错了。 (跳到答案的末尾,看一下加载代码的脚本片段就好了。
  3. 让我们看看我上面写的内容:

    使用:

    $.ajaxdatatype: 'jsonp'或使用

    $.getJson并将callback=?追加到网址(!NOT callback=test)。

    但是在您的测试网站上,您将callback=test而不是callback=?添加到网址并使用$.getJSON。哪个不起作用,因为当您使用$.getJSON并且想要真正发出jsonp请求时,文档非常清楚您需要做什么。

      

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

    当您设置callback=test时,jQuery无法识别您不是jsonp请求而不是json请求,因此无法按预期执行操作。只是对待发送callback = test,好像它是一个普通的get请求参数而不是jsonp回调。

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

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

    测试站点的工作代码段:

    $(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>");
                }
            }
        });
    });