【发布时间】:2014-11-04 16:37:23
【问题描述】:
在我的客户端 html / JS 代码中,我从域内调用外部 API 来获取 json 数据。另一个 API 在单独的域中运行,所以基本上它不允许我使用常规的 ajax/xhr 请求。我们与 API 供应商商定的解决方案是他们支持 jsonp。
所以我发送一个jsonp请求如下:
$.ajax({
url: "https://rest.somevendor.com/app/site/hosting/restlet.nl?script=204&deploy=1&cid=436&callback=myCallBack",
dataType: 'jsonp',
type: 'GET',
jsonp: "callback",
contentType: "application/json; charset=utf-8",
processData: false,
headers: {
"Authorization": "NLAuth nlauth_account=xxxxxxx,nlauth_email=yyyyy@pppp-zzzz.com, nlauth_signature=FGrmr5fjd"
},
success: function(data){
//console.log(data);
}
});
我的回调被 json 数据调用,但是有一个问题。 当我从浏览器 REST 客户端进行相同的调用时,我得到了一个有效的 json,它被转义了。但是,当我从客户端代码进行相同的调用时,我会在回调中取回数据:
function myCallBack(data) {
jsonString="";
try{
jsonString=JSON.parse(data);
}catch(err) {
alert(err.message)
}
}
解析函数抛出由未转义的字符 (") 导致的异常。由于某种原因,返回的数据似乎在到达我的回调函数之前以某种方式未转义。因此,我无法解析数据,并且遇到问题。
【问题讨论】:
-
你为什么有
contentType: "application/json; charset=utf-8",?这是一个 GET 请求。您没有描述内容类型的请求正文!为什么你有processData: false,?您没有data参数来防止被处理! -
完整的响应是什么样的?
-
你为什么有
headers: { "Authorization": "NLAuth nlauth_account=xxxxxxx,nlauth_email=yyyyy@pppp-zzzz.com, nlauth_signature=FGrmr5fjd" },?您使用的是 JSONP,无法设置自定义 HTTP 标头。 -
为什么要在 URL 中硬编码回调名称?为什么要尝试使用
jsonp: "callback"覆盖(不存在的)动态生成的回调名称? -
JSONP 调用返回一个对象,它不是字符串! jQuery 不对其进行解析,因此您尝试做的事情不会起作用。
标签: javascript jquery ajax json jsonp