手撕题之 JSONP

简介: 其实我在面试的时候没碰见过写 JSONP 的,但每次面试前我都会写一次 实现原理 利用script可以跨域请求实现,通过动态插入script标签,将src属性设置为目标请求,插入dom中,服务器接受该

其实我在面试的时候没碰见过写 JSONP 的,但每次面试前我都会写一次

实现原理

利用script可以跨域请求实现,通过动态插入script标签,将src属性设置为目标请求,插入dom中,服务器接受该请求并返回数据,数据通常被包裹在回调钩子中,然后浏览器解析 script并执行后端返回的回调+数据,而jsonp也因为是依赖scirpt实现,而script标签请求资源只支持get请求,所以jsonp无法使用post请求

实现代码

<body></body>
<script>
  // index.html  http://127.0.0.1:5500/index.html
  
  const jsonp = (url, params, cbName) => {
    const script = document.createElement("script");
    window[cbName] = (data) => {
      // do something
      console.log("back " + data);
      document.body.removeChild(script);
    };
    params = { ...params, callback: cbName };
    const arr = Object.keys(params).map((key) => `${key}=${params[key]}`);
    script.src = `${url}?${arr.join("&")}`;
    document.body.appendChild(script);
  };
  
  jsonp("http://127.0.0.1:8000", {}, "callback");
</script>

相同原理

  1. <link herf="url"></link>
  2. <img src="url"></img>

上面这个两个加载资源的标签同jsonp,不受跨域限制

也可以使用 iframe解决

使用场景

  1. 用于解决前端和后端交互数据时出现的跨域问题
  2. 现在常用与一些老浏览器不支持CORS时采用的针对GET请求的跨域解决方案(即 JSONP 不支持 POST

JSONP 为什么不能发送 POST

jsonp因为是依赖scirpt实现,而script元素请求资源只支持get请求,所以jsonp无法使用post请求

相关文章
|
8月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
61 0
|
4月前
|
JSON JavaScript 前端开发
JSONP 教程
JSONP 教程
68 7
|
8月前
|
前端开发 JavaScript
【Javascript】手撕Promise
【Javascript】手撕Promise
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
56 0
|
JSON JavaScript 前端开发
jsonp解决Ajax跨域问题
jsonp解决Ajax跨域问题
114 0
|
缓存 JavaScript 前端开发
开心档之jQuery - AJAX get() 和 post() 方法
【摘要】 jQuery - AJAX get() 和 post() 方法jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。HTTP 请求:GET vs. POST两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据GET 基本上用于从服务器获得(取...
|
前端开发
前端学习案例1-jsonp介绍
前端学习案例1-jsonp介绍
44 0
前端学习案例1-jsonp介绍
|
前端开发
前端学习案例4-jsonp介绍
前端学习案例4-jsonp介绍
72 0
前端学习案例4-jsonp介绍
|
JSON 前端开发 数据格式
牛客刷题——前端面试【三】谈一谈Promise、封装ajax、json数据使用
如何使用Promise、封装ajax、json数据以下方法告诉你。
199 0
|
JSON 缓存 前端开发
还在死磕 Ajax?那可就 out 了!
江山代有人才出,各领风骚数百年。
101 0
还在死磕 Ajax?那可就 out 了!

热门文章

最新文章