【发布时间】:2011-03-18 18:20:37
【问题描述】:
我知道 jsonp 是一种绕过同源策略的技术。您基本上在脚本标签中引用您的 json 服务服务器端点,因为脚本标签不受 SO 策略的约束。
我的问题是:假设服务器有一个提供 json 的端点,是否需要在服务器上进行任何修改才能在客户端使用 jsonp?
我认为没有,但想确定....
【问题讨论】:
标签: ajax jsonp ria server-side
我知道 jsonp 是一种绕过同源策略的技术。您基本上在脚本标签中引用您的 json 服务服务器端点,因为脚本标签不受 SO 策略的约束。
我的问题是:假设服务器有一个提供 json 的端点,是否需要在服务器上进行任何修改才能在客户端使用 jsonp?
我认为没有,但想确定....
【问题讨论】:
标签: ajax jsonp ria server-side
是的,JSONP 在渲染时略有不同,所以你的服务器需要支持它。
JSON 看起来像这样:
{ "name": "value" }
而 JSONP 看起来像这样:
functionName({ "name": "value" });
如果您使用的任何东西都支持它,那么您将被覆盖,但它与仅支持 JSON 不同。当服务器收到请求时,例如:http://example.com/json?callback=functionName,上面就是你应该渲染的,因为它在页面中的样子是这样的:
<script type="text/javascript" src="http://example.com/json?callback=functionName"></script>
这意味着需要返回运行的东西,作为说明,这是有效的:
<script type="text/javascript">
functionName({ "name": "value" });
</script>
如果您的服务器不支持 JSONP,它实际上是这样的:
<script type="text/javascript">
{ "name": "value" }
</script>
...你会得到语法错误,因为那不是有效的 JavaScript。
【讨论】:
eval()。
<script> 元素......它像任何其他 .js 文件一样被获取。这是一个普通的 GET ......这就是为什么它允许跨域而不是普通的 AJAX 请求。在 JSON 的情况下,响应是 eval'd 或更好,使用原生 JSON.parse() 几个浏览器已经实现....但 JSONP 是一个不同的球赛。