javascript - Google Chrome 扩展程序中的 JSONP 通信

标签 javascript jquery google-chrome-extension jsonp

我正在编写一个 Google Chrome 扩展程序。我想使用jsonp与jQuery进行跨域通信。这是ajax代码:

$.ajax({
    type : 'POST',
    url : $(this).attr('action'),
    data : $(this).serialize(),
    contentType: 'application/json; charset=utf-8',
    dataType : 'jsonp',
    success : function() {
        alert('A');
    }
});

这会调用此 URL:

http://sgsync.dev.kreatura.hu/api/signup/?callback=jQuery1710883696963544935_1327347078860&nick=&pass=&_=1327347087371

服务器使用以下数据回答 200 OK:

jQuery1710883696963544935_1327347078860({"messages":["Minden mez\u0151 kit\u00f6lt\u00e9se k\u00f6telez\u0151!"],"errorCount":1})

之后,我收到此错误消息:

Can't find variable: jQuery1710883696963544935_1327347078860

我尝试了所有方法,但无法理解问题所在。请帮助我!

请注意,我编写了服务器端代码,因此也可能存在问题。

提前致谢!

最佳答案

这如此令人困惑的部分原因是 jQuery API 混淆了 Ajax 调用与 JSONP 调用的问题。当将 $.ajaxdataType: 'jsonp' 一起使用时,不会执行 Ajax 调用(不使用 XHR 通信),而是使用带有回调的动态脚本注入(inject)。这意味着 type: 'POST' 将没有任何意义(因为动态脚本注入(inject)只能像 GET 那样工作),并且所有 data 将被编码为请求的 URL,而不是作为帖子正文发送。如果这确实是为了“POST”数据,则不应使用 JSONP(因为敏感数据将以明文形式发送)。

正如其中一条评论中提到的,此问题在本答案中得到解决,涉及来自 Chrome 内容脚本的 JSONP 请求以及从内容脚本使用 XHR。

JSONP request in chrome extension, callback function doesn't exist?

对于 Chrome 扩展程序,在 Chrome 扩展程序中使用“内容脚本”时,它们会强制您进入沙箱。您可以从 Chrome 扩展程序内容脚本中的请求中删除 dataType: 'jsonp',此调用应该可以正常工作。如果这不起作用,您可以尝试直接使用 XHRHttpRequest 进行调用:

var xhr = new XMLHttpRequest();
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.open("POST", $(this).attr('action'), true);
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
       alert("A");
  }
}
xhr.send($(this).serialize());

对于其他浏览器,我不确定他们的每个特定插件环境如何处理跨域 XHR 调用(或者他们是否首先允许这样做)。这是普通浏览器不允许的(除非使用类似 easyXDM 的东西)。

关于javascript - Google Chrome 扩展程序中的 JSONP 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977720/

相关文章:

对动态创建的文本框进行 javascript 验证

javascript - 使数据表响应

jquery - JCarousel Lite(多个轮播问题)

jQuery - 查找事件选项卡

javascript - 指定了 itemprop 属性,但该元素不是任何项目的属性

javascript - 从 Knex 获取行数

javascript - 如何设置内容宽度的textarea?

google-chrome - 从内容脚本 : Chrome Extension Development 激活 popup.html

javascript - 如何将 react setState 与 chrome API 一起使用

linux - Native Messaging 主机尝试发送长度为 460151579 字节的消息