Answers:
这是一个相当广泛的问题,可能需要一个维基。谷歌在这两个方面也有很多,但我想我可以提出几点要点。
如果这两个都不是问题,那么我只会选择您最容易或最熟悉的方法。如果不胜枚举,请尝试CORS,因为它是更“现代”的解决方案,而JSONP更像是一种hack,将数据转换为脚本以绕过跨域限制。但是,CORS确实通常需要更多的服务器端配置。
如果您使用的是jQuery,我不确定您在哪里想到CORS“ 对客户端更加友好并且易于实现 ” 的想法。见https://gist.github.com/3131951。jQuery提取了JsonP的详细信息,而实际上,根据所使用的技术,CORS可能很难在服务器端实现。
我最近开发了一个Web应用程序,它使用jquery和bone.js读取了我们控制的各种跨域Web服务,最终使用了Json-P而不是CORS,因为我们需要支持IE7,并且在IE7上要简单一些服务器端(我们运行带有DjangoRestFramework的Django),并且与客户端上的jquery几乎相同。
你很漂亮。如果您不必支持旧版浏览器(6年前发布的版本),那么我肯定会使用CORS。
CORS易于实现,因为如果您的API还不支持JSONP或CORS,则仅添加一些静态标头比修改响应主体更容易。
同样,使用CORS缓存请求也更容易。每个JSONP请求都必须是动态的,即使具有内存缓存内容也是如此。
JSONP仍然是一个脚本标记,因此无论它会导致某种程度的同步行为。CORS不会。
JSONP只能是GET。与CORS一样,您可以使用任何方法。
最后但并非最不重要的一点是,如果您使用的是jQuery v1.x,请考虑在某些常见情况下(例如,网络错误),对于JSONP请求,仍不调用error
和complete
(或更好的fail
和always
)处理程序。当然,有解决方法(超时设置,jQuery-JSONP插件),但我发现CORS不太烦人,特别是当跨域请求仅来自移动设备(即混合应用程序)时,因此您不需要对不幸的浏览器的支持。