【问题标题】:Does JSONP require server modifications?JSONP 是否需要服务器修改?
【发布时间】:2011-03-18 18:20:37
【问题描述】:

我知道 jsonp 是一种绕过同源策略的技术。您基本上在脚本标签中引用您的 json 服务服务器端点,因为脚本标签不受 SO 策略的约束。

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

我认为没有,但想确定....

【问题讨论】:

    标签: ajax jsonp ria server-side


    【解决方案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@函数)留给浏览器的实现者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2013-10-16
    相关资源
    最近更新 更多