我不明白为什么它会使用第二个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
答案 0 :(得分:1)
要让其他人发出jsonp请求,您需要检查服务器端是否在请求网址中有callback
参数。
e.g。
/shared/cfm/json.cfm?callback=foo&c=27321
(注意foo只是一个示例,它可以是任何类型的字符串,例如jQuery使用类似callback=jsonp1231313123
的内容)
如果是,则代替此
( {"COLUMNS": ...... } )
然后你需要返回它(必须在响应前面添加回调参数的值)
foo( {"COLUMNS": ...... } )
现在您应该能够使用
检索答案 $.ajax
和datatype: 'jsonp'
或
$.getJson("http://www.port.../json.cfm?callback=?", {c:'27321'}, somefn)
我怎么能这样说......你所遇到的问题是你没有仔细阅读我所写的内容。并且(也许?)没有费心阅读jQuery API documentation中$.ajax
和$.getJSON
中有关jsonp的内容的段落。
function
和return
关键字仍然存在)您的网址返回的数据http://kneedeepincode.com/api/test/没问题。至少在某种意义上说(你不尊重回调参数并且总是像设置callback=test
一样返回。但是这可以用于测试。但是引入了一个微妙的错误,让你认为它不起作用。
让我们看看我上面写的内容:
使用:
$.ajax
和datatype: '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回调。
如果您使用$.ajax
和datatype: '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>");
}
}
});
});