使用https而不是http时,JSONP请求失败

时间:2013-01-03 05:22:10

标签: jquery api google-app-engine jsonp

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

例如,我有一个网址 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);
        });
    }
});

我看到对网址中指定的API主机发出了适当的请求,并且成功中的回调函数已正确调用,并且传输了正确格式的数据。

但是,当我将API客户端的上述网址更改为 https://apiclient.com 时, API主机上未发现任何请求。我发现日志的任何一方都没有错误。

注意:API客户端唯一的区别是 http https

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

感谢。

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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

答案 2 :(得分: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

这是跨域get JSON

的示例

firefox在HTTPS方面存在问题,因为我知道如果您发送此类请求

,将会修复此问题
$.getJSON('ajax/test.json',{}, function(data) {
  $('.result').html('<p>' + data.foo + '</p>'
    + '<p>' + data.baz[1] + '</p>');
});

soruce AJAX https POST requests using jquery fail in Firefox

我希望这有帮助