2010-07-21 111 views
28

据我所知,jsonp是一种绕过同一起源策略的技术。您基本上是在脚本标记中引用您的json服务服务器端点,因为脚本标记不受SO策略的限制。JSONP是否需要修改服务器?

我的问题是:假设一个服务器有一个提供json的端点,服务器上是否需要修改以便在客户端使用jsonp?

我觉得没什么,但要确保....

回答

33

没错,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。

+1

和你的js代码必须实现functionName?是否需要评估json以获取js对象? – hvgotcodes 2010-07-21 01:37:33

+0

@hvgotcodes - 是的,客户端具有该功能(例如jQuery默认创建一个动态)。它是传递给函数的JSON(JSON是有效的对象文字符号,只是它的一个子集),所以不需要执行'eval()'。 – 2010-07-21 01:40:05

+1

我不明白你为什么不需要评估它。不管jsonp,大多数js库都不会评估通过xhrs返回的json来获取json代表的实际js对象吗? – hvgotcodes 2010-07-21 01:44:01