如果您正在构建AJA~Xy应用程序,JSONP即使您没有计划任何cross-domain请求,使用请求/响应是否有任何缺点?
我唯一能想到的是回调包装器有几个额外的字节......
编辑:
我发现这也暗示security and error handling了潜在的问题......
没有错误处理.该
script injection要么工作,要么没有.如果出现错误injection,它会点击页面,并且没有窗口错误处理程序(坏,坏,非常糟糕),你需要确保返回值在server side.
我认为这不是error handling一个很大的问题...我们大多数人都会使用一个库来生成JSON......我的回答的良好构成并不是这个问题的关注点.
和安全:
网上有文档可以提供帮助,但作为粗略检查,我会检查
server side脚本中的引荐来源.
看起来这是任何类型的回应的潜在问题......当然,JSONP在安全领域没有什么独特之处......?
我想获取文件源并将其包装在JSONP中.
例如,我想从我不拥有的主机中检索pets.txt作为文本.我想通过使用客户端JavaScript来做到这一点.
我正在寻找可以将任何东西转换为JSONP的在线服务.
Yahoo Query Language就是其中之一.
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D"http://elv1s.ru/x/pets.txt"&format=json&callback=grab
如果robots.txt未阻止URL,则此方法有效.YQL 尊重robots.txt.我无法获取http://userscripts.org/scripts/source/62706.user.js,因为它是通过robots.txt阻止的.
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D"http://userscripts.org/scripts/source/62706.user.js"&format=json&callback=grab
"禁止":"域名的robots.txt禁止抓取网址:http://userscripts.org/scripts/source/62706.user.js "
所以我正在寻找其他解决方案.
该$.getJSON()文件规定:
如果指定的URL位于远程服务器上,则该请求将被视为JSONP.有关
jsonp更多详细信息,请参阅$ .ajax()中有关数据类型的讨论.
数据类型的$.ajax()文档jsonp说明(强调我的):
使用JSONP加载JSON块.会添加一个额外的"?callback =?" 到URL的末尾以指定回调.
所以,如果我$.getJSON()使用跨域URL 调用,那么额外的"回调=?" 参数应自动添加.(文档的其他部分支持这种解释.)
但是,我没有看到这种行为.如果我不添加"callback =?" 显式地,jQuery错误地生成XMLHttpRequest(由于我无法读取响应跨域,因此返回空数据).如果我明确地添加它,jQuery正确地发出<script>请求.
这是一个例子:
var URL = "http://www.geonames.org/postalCodeLookupJSON" +
"?postalcode=10504&country=US";
function alertResponse(data, status) {
alert("data: " + data + ", status: " + status);
}
$.getJSON(URL, alertResponse);
// alerts "data: null, status: success"
$.getJSON(URL + "&callback=?", alertResponse);
// alerts "data: [object Object], status: undefined"
Run Code Online (Sandbox Code Playgroud)
发生什么了?我误解了文档还是遗忘了什么?
不言而喻,这不是一个大问题,但我正在创建一个Web API,我故意将回调参数设置为"回调",希望能很好地适应jQuery的使用.
谢谢!
(编辑:如果你有兴趣,我会在jQuery论坛中交叉发布.)
我正在编写一个应用程序,我需要从另一台服务器访问客户端的一些json数据.由于跨域问题,我计划使用jsonp.jQuery允许我使用$ .getJSON()方法执行此操作,但是,我无法判断方法是否已失败(即服务器没有响应或其他内容).所以我尝试使用$ .ajax来获取JSON数据.但它不起作用,我不知道该尝试什么.这是一个显示我的问题的示例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>TEST</title>
<script type="text/javascript" src="scripts/jquery-1.5.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#button_detect').click(function(){
var feedApiAjax = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=';
var feedApiGetJSON = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=';
var feedUrl = 'http://www.engadget.com/rss.xml';
$.ajax({
url: feedApiAjax + feedUrl,
datatype: 'jsonp',
success: function(data) {
console.log('$.ajax() success');
},
error: function(xhr, testStatus, error) {
console.log('$.ajax() error');
}
});
$.getJSON(
feedApiGetJSON + feedUrl,
function(data) {
console.log('$.getJSON success');
});
});
});
</script>
</head>
<body>
<div id="button_detect">CLICK ME!!!!</div>
</body>
Run Code Online (Sandbox Code Playgroud)
如果您使用此代码创建一个网页并单击"Click Me"div,您将看到$ .getJSON请求正在运行而$ …
这是我的AJAX调用:
$.ajax({
type: 'GET',
url: User.baseURL + 'api/users/briefProfile',
dataType: 'jsonp',
success:function(data,text,xhqr){
//var data = $.parseJSON(data);
console.log(data);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log("ERROR");
},
complete: function(jqXHR, textStatus) {
console.log("complete");
}
});
Run Code Online (Sandbox Code Playgroud)
错误是: Uncaught SyntaxError: Unexpected token :
我在Chrome中得到了200的响应(最新).我在响应中获得了有效JSON的所有内容.我并不在乎浏览器没有正确解析它,但我真的希望在完整的回调中访问它.
知道什么是a)导致错误?b)如何到达客户端返回的内容?
我正在使用jQuery的$ .ajax使用JSONP向第三方服务器发出请求.我将方法指定为POST,但它仍然使用GET:
$.ajax({
type: "POST",
dataType: "json",
url: other_server + "/run?callback=?",
data: {
code: $(code).val()
},
success: function(obj) {
var res = obj.results;
$(results).val(res);
}
});
Run Code Online (Sandbox Code Playgroud)
查看jQuery源代码,我看到这两行似乎强制所有跨域请求都是GET,但我不明白为什么需要如此:
if ( s.crossDomain ) {
s.type = "GET";
Run Code Online (Sandbox Code Playgroud)
是否可以使用POST而不是GET执行此操作?为什么jQuery强制使用GET?
请考虑这个javascript:
$.ajax({
url:'http://ichart.finance.yahoo.com/table.csv?s=GS&a=00&b=1&c=2010&d=08&e=3&f=2012&g=d&ignore=.csv',
type:'get',
dataType:'jsonp',
success:function(data){
alert(data);
}
})
Run Code Online (Sandbox Code Playgroud)
URL返回.csv文件,但我指定jsonp数据类型,因为这是一个跨域的ajax请求.没有该参数,我得到"不允许原点"错误.
由于我指定了jsonp数据类型,因此ajax函数会抛出错误,因为.csv文件不是JSON格式.但是在开发控制台中,我可以看到浏览器会收到一个连贯的.csv文件.所以我知道我已成功接收CSV文件.我认为它应该是可能的,但我不确定如何正确地将这个csv文件接收到我的ajax函数?
当然,如果我能使这个URL返回一个格式正确的JSON字符串,那将是最好的,但我不确定我能做到这一点.
这是一个小提琴,你可以尝试它,你将不得不打开开发控制台来看到这个错误:http://jsfiddle.net/92uJ4/3/
任何帮助是极大的赞赏.
蒂姆
诺比在这里.我正在编写一个需要从另一个域读取XML文件的客户端脚本.我尝试过使用JSONP.我得到200响应但客户端由于某种原因无法访问返回的数据.我收到两个错误:
Resource interpreted as Script but transferred with MIME type text/xml
Run Code Online (Sandbox Code Playgroud)
和
Uncaught SyntaxError: Unexpected token <
Run Code Online (Sandbox Code Playgroud)
这是代码(我删除了XML url,因为它是保密的):
$(document).ready(function() {
$.getJSON("urlOfFilecallback=?", function(data) {
console.log(data)
})
});
Run Code Online (Sandbox Code Playgroud)
当我尝试在控制台中呈现数据时,我得到:
ReferenceError: data is not defined
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我需要使用代理吗?
我正在尝试使用AngularJS调用Yelp API,但我遇到了麻烦.我一直收到400坏请求,我不知道为什么.
Yelp API文档:
http://www.yelp.com/developers/documentation/v2/authentication http://www.yelp.com/developers/documentation/v2/search_api
包含Yelp API生成密钥的页面:
http://gyazo.com/fa918329eb0cde18a5db242d1d0b0b0e
这是我的代码执行调用的片段:
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
return result;
}
app.factory("MyYelpAPI", function($http) {
return {
"retrieveYelp": function(name, callback) {
$http.jsonp("http://api.yelp.com/v2/search?term=food&location=San+Francisco&callback=JSON_CALLBACK",
{
params: {
oauth_consumer_key: /* Consumer Key */,
oauth_token: /* Token */,
oauth_signature_method: "hmac-sha1",
oauth_signature: /* Token Secret */,
oauth_timestamp: new Date().getTime(),
oauth_nonce: randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
}
}
).success(callback);
}
}
});
Run Code Online (Sandbox Code Playgroud) 我有以下代码,我无法理解它为什么不返回并在HTML正文中打印它.
var pageURL = document.URL;
var tweet = "https://cdn.api.twitter.com/1/urls/count.json?url='"+ pageURL + "'";
$.getJSON(tweet,function(json){
$('#twitterfeed').html(json.count);
});
<div id="twitterfeed"></div>
Run Code Online (Sandbox Code Playgroud)
https://cdn.api.twitter.com/1/urls/count.json?url=http://www.google.com
返回{"count":23844636,"url":"http://www.google.com/"}
以下似乎没有用,有没有人知道为什么?
jsonp ×10
jquery ×7
ajax ×5
cross-domain ×3
javascript ×3
json ×3
angularjs ×1
api ×1
csv ×1
twitter ×1
web-services ×1
xml ×1
xss ×1
yelp ×1