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

Posted

技术标签:

【中文标题】使用 https 而不是 http 时 JSONP 请求失败【英文标题】:JSONP request fails when https is used instead of http 【发布时间】: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。我猜您正在尝试访问安全站点,而您的页面实际上是不安全的? 【参考方案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 协议。然后,比较两种协议的结果。

以上是关于使用 https 而不是 http 时 JSONP 请求失败的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS 到 HTTP JSONP 请求

返回 XML 时使用 JSONP

最佳长期选择:JSONP vs EasyXDM

如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?

如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?

是否可以从 HTTPS 向 HTTP 发出 JSONP 请求?