JSONP 是不是需要服务器修改?
Posted
技术标签:
【中文标题】JSONP 是不是需要服务器修改?【英文标题】:Does JSONP require server modifications?JSONP 是否需要服务器修改? 【发布时间】:2011-03-18 18:20:37 【问题描述】:我知道 jsonp 是一种绕过同源策略的技术。您基本上在脚本标签中引用您的 json 服务服务器端点,因为脚本标签不受 SO 策略的约束。
我的问题是:假设服务器有一个提供 json 的端点,是否需要在服务器上进行任何修改才能在客户端使用 jsonp?
我认为没有,但想确定....
【问题讨论】:
【参考方案1】:是的,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。
【讨论】:
你的js代码必须实现functionName吗?是否需要评估 json 来获取 js 对象? @hvgotcodes - 是的,客户端具有该功能(例如,jQuery 默认动态创建一个)。将 JSON 传递给函数(JSON 是有效的对象文字表示法,只是它的一个子集),因此不需要执行eval()
。
我不明白你为什么不需要评估它。不管jsonp如何,大多数js库不评估通过xhrs返回的json来获取json代表的实际js对象吗?
@hvgotcodes - 不,它不是通过 JavaScript(或 XmlHttpRequest)运行的,它实际上是一个添加到页面的 <script>
元素......它像任何其他 .js
文件一样被获取。这是一个普通的 GET ......这就是为什么它允许跨域而不是普通的 AJAX 请求。在 JSON 的情况下,响应是 eval'd 或更好,使用原生 JSON.parse()
几个浏览器已经实现....但 JSONP 是一个不同的球赛。
我的理解是关于如何处理 any 脚本标签内容的决定(即是在本机代码级别解析它还是将其提供给高级 JavaScript @ 987654331@函数)留给浏览器的实现者。以上是关于JSONP 是不是需要服务器修改?的主要内容,如果未能解决你的问题,请参考以下文章