【问题标题】:JSONP request fails when https is used instead of http使用 https 而不是 http 时 JSONP 请求失败
【发布时间】:2012-12-17 11:52:56
【问题描述】:

我有一个 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 主机发出了适当的请求,success 中的回调函数被正确调用,并传递了正确格式的数据。

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

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

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

谢谢。

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

【问题讨论】:

  • 您的服务器是否配置为接受 Https 请求?在您的 ajax 查询中,也添加一个错误函数并检查是否有任何错误。
  • 能否正常调用https API URL?也许是证书错误或其他什么?
  • @ryadavilli no AJAX error handler for jsonp requests.. 参见文档 注意:跨域脚本和 JSONP 请求不调用此处理程序。
  • 嗯,第一步是找出真正的问题是什么。我建议使用像 fiddler2 这样的工具(尽管 firebug/开发者工具足以看到我认为的错误代码)来查看发送的内容返回的内容。跨度>
  • 以下是可能导致此问题的提示:ithemes.com/codex/page/Fix_Non-SSL_Elements_on_SSL_Page。我猜您正在尝试访问安全站点,而您的页面实际上是不安全的?

标签: jquery api google-app-engine jsonp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • $.getJSON 是 $.ajax 的简写,所以行为是相同的。
    【解决方案3】:

    更改协议与更改 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>');
    });
    

    来源AJAX https POST requests using jquery fail in Firefox

    希望对你有帮助

    【讨论】:

    • 首先在我的情况下,它在没有 http 的情况下都可以工作,并且不能与 https 一起工作。所以同源策略在这里不是问题,我使用的是 GET 而不是 POST。我相信 $.getJSON 只是 $.ajax 的简写,如文档中所述。您的解决方案不能解决问题。
    • 我认为问题可能是 HTTP 和 HTTPS 返回的数据不一样。如果是这种情况,请尝试从 fiddler 获取 URL,将 Content-Type 指定为 application/json,同时使用 HTTP 和 HTTPS 协议。然后,比较两种协议的结果。
    猜你喜欢
    • 2012-03-25
    • 2013-11-02
    • 1970-01-01
    • 2014-08-06
    • 2014-02-23
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多