【问题标题】:JSONP Callback - data arrives unescaped when using jQuery callJSONP 回调 - 使用 jQuery 调用时数据未转义
【发布时间】: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


【解决方案1】:

最终我绕过了这个问题,通过实现一个代理服务器来进行 ajax 调用(没有浏览器强制执行的 CORS 限制),我的客户端调用是针对这个代理的。

当然,在我的代理中,我实现了将 Access-Control-Allow-Origin 标头与客户端域一起返回,以便此调用正常工作。

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 2014-02-05
    • 1970-01-01
    • 2013-02-23
    • 2012-06-25
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多