JSONP 的工作原理,JSONP Demo讲解

JSONP  是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback 或者开始就定义一个回调方法,参数给服务端,然后服务端返回数据时会将这个callback 参数作为函数名来包裹住 JSON  数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

JSONP  JSON  的区别: JSON  是一种传输格式,而 JSONP  呢是一种数据的获取方式。其实他们没什么相关性,有的人说带callback JSON  传输就是 JSONP  ,下面我会证明这是错误的说法。 JSONP  可以跨域,记住这一点就可以了。下面开始 Demo  演示。

一、简单JSONP演示

JS  代码:


  
  
  1. <script>
  2. //jsonp回调方法,一定要写在jsonp请求前面
  3. function callback(txt){
  4. alert(txt);
  5. }
  6. </script>
  7. <script src ="/demo/testJsonp.shtml" type="text/javascript" ></script>

Java  代码(后端):


  
  
  1. /**
  2. * jsonp 测试
  3. * @return
  4. */
  5. @RequestMapping(value="testJsonp",method=RequestMethod.GET)
  6. @ResponseBody
  7. public String testJsonp(){
  8. return "callback('test jsonp');";
  9. }

此时,当页面加载的时候,会alert 一个messag “test jsonp” ,表示成功了,这里注意的一点就是,回调方法要在调用之前,要不然会出现说callback 方法是未定义的错误。

二、自定义callback函数

js方法:


  
  
  1. <script>
  2. //jsonp回调方法,一定要写在jsonp请求前面
  3. function testjson(txt){
  4. alert(txt);
  5. }
  6. </script>
  7. <script src ="/demo/testJsonp.shtml?callback=testjson" type="text/javascript" ></script>

Java代码(后端)


  
  
  1. /**
  2. * jsonp 测试
  3. * @return
  4. */
  5. @RequestMapping(value="testJsonp",method=RequestMethod.GET)
  6. @ResponseBody
  7. public String testJsonp(String callback){
  8. return callback +"('test jsonp');";
  9. }

很easy吧。

三、 Ajax  JSONP Demo。

JS代码:


  
  
  1. <script>
  2. function callback_fn(data){
  3. alert(data + ":2");
  4. }
  5. $.ajax({
  6. type:"get",
  7. dataType:"jsonp",
  8. url:"/demo/testJsonp.shtml",
  9. jsonpCallback:"callback_fn",
  10. success:function(data){
  11. alert(data + ":1");
  12. }
  13. });
  14. </script>

Java  代码(后端)


  
  
  1. @RequestMapping(value="testJsonp")
  2. @ResponseBody
  3. public String testJsonp(String callback){
  4. return callback +"('test jsonp');";
  5. }

这时候会调用callback_fn 方法,并且把返回值赋值给data 。这里看不出来跨域,那么我来演示一下跨域的 Demo 

四、跨域 JSONP 

其实上面的都支持跨域,但是为了更真实的演示,我找了一个sina的 JSONP  链接来演示。

JS代码


  
  
  1. <script>
  2. function callback_fn(data){
  3. console.log("callback_fn");
  4. console.log(data);
  5. }
  6. $.ajax({
  7. type:"get",
  8. dataType:"jsonp",
  9. url:"http://sax.sina.com.cn/newimpress?adunitid=PDPS000000047325&rotate_count=36",
  10. jsonpCallback:"callback_fn",
  11. success:function(data){
  12. console.log("success");
  13. console.log(data);
  14. }
  15. });
  16. </script>

看控制台输出的内容。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值