20

我有一个 API 客户端,它使用 JQuery 发出 JSONP 请求。当这个 API 客户端不使用 SSL 时一切正常,但是在使用 SSL 时会失败。

例如,我有一个 URL http://apiclient.com,并且我正在从该域发出以下 JSONP 请求:

$.ajax({
    url: url,
    dataType: "jsonp",
    contentType: "application/json; charset=utf-8",
    success: function(data)
    {
        $.each(data.services, function(index, service) {
            processService(service);
        });
    }
});

我看到向 url 中指定的 API 主机发出了适当的请求,并且成功调用了回调函数,并将正确格式化的数据传递给它。

但是,当我将 API 客户端的上述 URL 更改为https://apiclient.com时,在 API 主机上没有观察到任何请求。我在日志的任何一侧都没有看到错误。

注意:唯一的区别是API 客户端上的httphttps 。

使用 https 域时是否需要以不同方式处理 JSONP 请求?

谢谢。

编辑:此问题仅在 Chrome 中观察到。它适用于 Firefox 和 Safari。但是,我在 FireFox 上收到了一个快速警告,询问我即将从加密站点发出未加密的请求。我允许它,再也没有看到警告。

4

3 回答 3

11

找到了解决方案。问题是 JQuery 和其他资源是从非安全站点导入的。解决方案是从 https 引用。

于 2013-01-08T17:29:02.850 回答
1

对于 http 和 https 的 JSONP 请求应该没有任何不同。

试试我们的 .getJSON:

$.getJSON(url, function(data) {
  $.each(data.services, function(index, service) {
        processService(service);
    });
});

使用 jQuery.ajax() 会导致跨浏览器问题,但 jQuery.getJSON() 不会出现这种情况。查看 jQuery 网站了解更多信息:http ://api.jquery.com/jQuery.getJSON/

这个问题有类似的帖子:JSONP To Acquire JSON From HTTPS Protocol with JQuery

于 2013-01-07T16:17:45.110 回答
1

更改协议与更改 URL 的任何其他部分的效果相同——它会触发违反同源策略并强制您进入跨域模式。如果您已经可以使用跨域访问,它将继续使用 https 以及使用 http。

例如,您可以使用 getJSON

$.getJSON('ajax/test.json', function(data) {
  $('.result').html('<p>' + data.foo + '</p>'
    + '<p>' + data.baz[1] + '</p>');
});

检查完整的 getJSON 文档http://api.jquery.com/jQuery.getJSON/

我错了吗...使用 Juqery.ajax 会导致跨浏览器问题,但不会导致 Jquery.getJSON

http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

这里是一个跨域获取 JSON 的例子

firefox 的 HTTPS 有问题,我知道如果您像这样发送请求,它将被修复

$.getJSON('ajax/test.json',{}, function(data) {
  $('.result').html('<p>' + data.foo + '</p>'
    + '<p>' + data.baz[1] + '</p>');
});

使用jquery的 AJAX https POST 请求在 Firefox 中失败

我希望这有帮助

于 2013-01-08T06:58:29.173 回答