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)运行的,它实际上是一个添加到页面的 &lt;script&gt; 元素......它像任何其他 .js 文件一样被获取。这是一个普通的 GET ......这就是为什么它允许跨域而不是普通的 AJAX 请求。在 JSON 的情况下,响应是 eval'd 或更好,使用原生 JSON.parse() 几个浏览器已经实现....但 JSONP 是一个不同的球赛。 我的理解是关于如何处理 any 脚本标签内容的决定(即是在本机代码级别解析它还是将其提供给高级 JavaScript @ 987654331@函数)留给浏览器的实现者。

以上是关于JSONP 是不是需要服务器修改?的主要内容,如果未能解决你的问题,请参考以下文章

ajax 和jsonp 不是一码事

SonarQube 是不是支持 JSONP?

jsonp和ajax的区别

初识jsonp

Ajax和Jsonp的工作原理,以及区别

Ajax和Jsonp的工作原理,以及区别。