使用 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 客户端的唯一区别是 http 和 https。
在使用 https 域时是否需要以不同的方式处理 JSONP 请求?
谢谢。
编辑: 此问题仅在 Chrome 中观察到。它适用于 Firefox 和 Safari。 但是,我在 FireFox 上收到了一个快速警告,询问我即将发出未加密的请求 加密网站。我允许它,再也没有看到警告。
【问题讨论】:
您的服务器是否配置为接受 Https 请求?在您的 ajax 查询中,也添加一个错误函数并检查是否有任何错误。 能否正常调用https API URL?也许是证书错误或其他什么? @ryadavilli no AJAX error handler forjsonp
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 请求失败的主要内容,如果未能解决你的问题,请参考以下文章
如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?