jsonp

说到Ajax,就涉及到跨域访问的问题
解决跨域访问的方法:
1、CORS
2、反向代理
3、jsonp : 纯前端能实现的跨域,前两者不能。


jsonp是什么?

利用script的src跨域访问资源,而后台对应的返回一个函数调用,然后把JSON数据放在函数的参数里面返回给前端

所以它是JSON使用的一种模式

如果后台没有写对应jsonp接口,那么就请求不到了。都得通过后台的允许。


jsonp作用: 跨域获取数据。


jsonp的实现原理

script的src属性具备: 跨域请求资源的能力
那么可以通过 src 跨域请求资源

但是后台不一定是 nodejs,可能是php等,不同语言的函数function fn(){} 不同写法

任何语言基本都支持JSON

src请求过程中,默认使用GET请求方式,
存在问题:
比如后台返回 fy(),那么后台怎么知道前端的函数名就叫fy呢?
所以要想办法跟后台沟通一下,
怎么沟通? :通过请求的参数
假如请求的路径是 localhost?callback=liang,那么请求路径的时候怎么知道这个名字? :GET方式的 参数都在 ?后面
jsonp必须指定回调函数。callback这个参数的值就是告诉后端 前端的函数名叫什么
?后面的后端能取到,那么就能取到fy字段

所以后端返回什么是由请求的路径的callback的回调来决定的


一个简单的jsonp实例

1、打开终端 先初始化:npm init
2、然后安装 koa: npm i -S koa
3、建一个后端入口程序 test.js
4、 然后导入 koa模块
5、拿到koa生成的app 服务器对象

// jsonp.html总代码

<script>
  function liang(obj) {
      console.log("后台传过来的前端数据");
      console.log(obj);
  }

  document.onclick = function () {
      const script = document.createElement('script');
      script.src = "http://localhost:3000?key=value&callback=liang"
      document.body.appendChild(script);
  }
  // 这里就可以跨域请求了
  // 这就是跨域访问了

  /*
    jsonp在跨域请求的时候,通过script的src,而src默认通过GET方式请求,也不能改变。
    所以callback的参数要跟在请求接口的?的后面,指定函数名字
  */

</script>
<script src="http://localhost:3000?key=value&callback=liang"></script>
// 后台 test.js 总代码

// 导入 koa模块
const Koa = require("koa");
// 拿到koa生成的app 服务器对象
const test = new Koa;

// 监听
test.use(async ctx => {
    const callback = ctx.query.callback;
    // 纯文本不会返回,所以要设置类型
    ctx.type = "text/javascript";
    ctx.body = `${callback}({a:'后端传过来的数据'})`
    console.log(ctx.query);
})
// 监听 3000端口
test.listen(3000);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁什么鸭,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值