Page 78 - JavaScript修炼之道
P. 78

68       第五部分  服务器端技术


             任务 30 使用 JSON-P


                 要把远程的结构化数据传到JavaScript客户端,最主要的方法就是使用JSON-P。它的传输主要依
             赖于动态生成的<script>标签,这会产生一个有趣的副作用:传输的数据可以不限于同一来源。
             现在越来越多的Web服务和API(尤其是REST风格的)都提供了JSON格式的输出和JSON-P支持。

                 其背后的思想很简单:你得到一份JavaScript代码,这份代码把正常的JSON字面量作为参数
             传给你提供的回调函数。这意味着回调函数预先由你的代码提供并且设为全局可访问(这样不
             是很好,但没有别的办法)。

                 受你的习惯以及你对要用JSON-P的远程资源的信任程度的影响,这要么减轻了你的负担(是
             一种极好的模仿跨域Ajax的方法),要么需要你做更多的考虑(JSON-P实质上是在你的页面上运
             行第三方提供的JavaScript)。

                 如果你只是连接自己的服务器和资源,那就完全没问题,这完美极了。但如果要连接并不完
             全信任的第三方资源,就会比较麻烦。由于涉及的运行机制(<script>标签),你没办法预解析
                                                                  ①
             返回的JavaScript代码以确保它只是做一次安全的JSON-P回调 。如果需要预解析这一中间步骤,
             你就得先用Ajax获得JS代码,然而正如我们在下个任务中会看到的,对于第三方资源,这种方法
             并非在所有的浏览器上都可用 。
                                       ②
                 不管怎么说,最终应该是由你自己来衡量远程JSON-P提供者的可信程度与可靠性。

                 我必须指出,我们用的传输方式(即动态  <script> 标签)是把JSON-P限制为GET请求,
             因此也就把加载量限制到了大约4KB(传统的GET限制)。尽管后者没办法纠正,但是只要在服
             务器端做一些修改,我们就能把GET请求改为其他的请求。我们会在任务32中看到这种做法。















             ——————————
                ① 期望服务器返回的JS代码是callback(json),其中callback是客户端设置并告诉服务器端的回调函数名,
                  json是服务器端整合的数据。本例给出的服务器端的这段PHP代码说得很清楚:echo "$cb($response);";。*
                ② 意思就是要预解析JS代码,还得用跨域Ajax来获取这个JS代码(如果第三方资源是跨域的话),所以比较麻烦。*
   73   74   75   76   77   78   79   80   81   82   83