json - 前端跨域-JSONP

前端之家收集整理的这篇文章主要介绍了json - 前端跨域-JSONP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前端跨域方案有很多种,这次介绍的是JSONP。

一、什么事跨域

受浏览器的同源策略的约束,访问不同的域名加协议、端口(三者任意一个不同)的资源将会照成跨域问题。

二、JSONP

JSONP,JSON with Padding(填充式json或参数式json的缩写),是 json 的一种”使用模式”。

由于<script>标签不受同源策略的约束,它可以载入任意地方的 JavaScript 文件,而jsonp就是利用的这一缺陷。他的基本原理就是通过动态创建<script>标签,然后把src指向服务端地址,而这个地址后面跟个参数callback=***,服务端在返回数据时,在***放置一个方法,相当于在前端执行***这个方法,所以在请求前我们需要给window绑定这个方法

三、实现

客户端

如果直接进入页面后就要进行跨域,可以直接写HTML元素:

  1. <script>
  2. function jsonpCallback(data) {
  3.     console.log(data);
  4. }
  5. </script>
  6. <script src="http://127.0.0.1:8088/jsonp?callback=jsonpCallback" type="text/javascript"></script>

要注意的是jsonpCallback要先定义,否则会执行该函数出错。

或者我们可以动态的创建<script>标签,并添加页面中的方式加载:

  1. <script type="text/javascript">
  2. function startJsonp() {
  3.     var script = document.createElement('script');
  4.     script.src = 'text/javascript';
  5.     script.src = 'http://127.0.0.1:8088/jsonp?callback=jsonpCallback';
  6.     document.body.appendChild(script);
  7. }
  8.  
  9. function jsonpCallback(data) {
  10.     console.log(data);
  11. }
  12.  
  13. startJsonp();
  14. </script>

当然,这两种方式没有本质的区别。

服务端

后端使用NodeJS实现:

  1. var http = require('http'),url = require('url'),querystring = require('querystring'),server = http.createServer();
  2. // request请求
  3. server.on('request',function(req,res){
  4.     var urlPath = url.parse(req.url).pathname;
  5.     var qs = querystring.parse(req.url.split('?')[1]);
  6.     if (urlPath === '/jsonp' && qs.callback){
  7.         res.writeHead(200,{'Content-Type':'application/json;charset=utf-8'});
  8.         var data = {
  9.             "hello": "world"
  10.         };
  11.         data = JSON.stringify(data);
  12.         var callback = qs.callback+'('+data+');';
  13.         res.end(callback);
  14.     }
  15. }).listen(8088);

当请求的路径是/jsonp时,我们会去将callback和数据返回给浏览器,而浏览器则会调用window下的该方法,所有我们可以在控制台上看到打印的数据。

JSONP用起来的话,其实也是很简单的,且对于信任的域,这样调用资源也是很方便的。需要注意的是JSONP只支持GET请求,不支持POST请求。

猜你在找的Json相关文章