原生js实现JSONP

2023-05-16

介绍

JSONP是JSON with Padding(填充式JSON或参数式JSON)的简写,是一种非常常用的跨域请求方式。主要原理是利用了script 标签可以跨域请求的特性,由其 src属性发送请求到服务器,服务器返回 JavaScript 代码,浏览器接受响应,然后就直接执行了,这和通过 script 标签引用外部文件的原理是一样的。

JSONP由两部分组成:回调函数数据,回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般在请求中指定。当服务器响应时,服务器端就会把该函数和数据拼成字符串返回。

JSONP的请求过程

  • 请求阶段:浏览器创建一个 script 标签,并给其src 赋值(类似 http://example.com/api/?callback=jsonpCallback)。
  • 发送请求:当给scriptsrc赋值时,浏览器就会发起一个请求。
  • 数据响应:服务端将要返回的数据作为参数和函数名称拼接在一起(格式类似”jsonpCallback({name: 'abc'})”)返回。当浏览器接收到了响应数据,由于发起请求的是 script,所以相当于直接调用 jsonpCallback 方法,并且传入了一个参数。

服务端交互示意图

server1代码(Nodejs实现)

var Koa = require('koa');
var Router = require('koa-router');
var querystring = require('querystring');
var app = new Koa();
var router = new Router();

//处理get请求
router.get('/get', async function(ctx){
    var params = querystring.parse(ctx.request.url.split('?')[1]);
    var data = { message: "我是" + ctx.request.header.host + ",我收到了你的get请求!!!" }
    ctx.status=200;
    ctx.body=params['callback']+'('+JSON.stringify(data)+');';
});

app
    .use(router.routes())
    .use(router.allowedMethods())

app.listen(3000);

server2代码

var Koa = require('koa');
var Router = require('koa-router');
var render = require('koa-art-template');
var path = require('path');

var app = new Koa();
var router = new Router();

//配置模板引擎
render(app, {
    root: path.join(__dirname, 'views'),
    extname: '.html',
    debug: process.env.NODE_ENV !== 'production',
});

router.get('/index.html', async function (ctx) {
    await ctx.render('server2');
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(4000);

前端代码

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>原生js实现</title>
</head>

<body>
    <div><button>点击我发送get请求</button></div>
    <!-- <script>
        function jsonpcallback(response){
            alert(response.message);
        }
    </script>
    <script src="http://127.0.0.1:3000/get?callback=jsonpcallback" type="text/javascript"></script> -->
</body>
<script>
    document.getElementsByTagName('button')[0].addEventListener('click', function () {
        ajax('http://127.0.0.1:3000/get', function(response){
            alert(response.message);
        });
    });
    function ajax(url, callback){
        var jsonp=document.createElement('script');
        jsonp.type = 'text/javascript';
        jsonp.src=url+'?callback=jsonpcallback';
        jsonpcallback = function(response){
            callback(response);
        };
        document.getElementsByTagName('head')[0].appendChild(jsonp);
    }
</script>

</html>

分析

其实上述过程可以总结为:

function jsonpcallback(response){
    alert(response.message);
}
jsonpcallback({"message":"我是127.0.0.1:3000,我收到了你的get请求!!!"});

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原生js实现JSONP 的相关文章

随机推荐

  • linux 命令行下查看 html 和 pdf 文件方法

    1 xff1a 打开 html 文件 在linux 命令行 输入firefox help 显示信息 查看某个html 文件 xff0c 举例如下 xff0c 输入命令后 大概需要等3秒 xff0c firefox进程启动 xff0c 浏览器
  • ROS 与 MATLAB通信

    ros 与 matlab 通讯使用的是ros中的主从机策略 1 准备条件 1 首先我们需要在matlab上安装 Robotics System Toolbox 工具箱 xff0c matlab2015B及以后自动安装有这个工具箱 xff0c
  • radmin

    正向连接 xff1a 由控制端发起连接 xff08 RADMIN xff09 反向链接 xff1a 由被控端发起连接 xff08 鸽子 xff09 radmin视频教程 xff1a http video sina com cn v b 68
  • Python利用GPU加速代码进行深度学习

    对于初次使用GPU加速代码的学习者来说 xff0c 需要在电脑上安装支持GPU加速的部件 xff0c 分以下三个步骤 xff1a 安装支持GPU版本的Pytorch xff08 非cpu版本 xff09 安装GPU版本的pytorch 在如
  • 6.4学习记录

    因为最近在看的一本书叫 高质量前入式LinuxC编程 xff0c 所以大部分内容是直接借鉴的 以下为6 4的学习记录 1 数据类型这一章中 xff0c 变量和常量的区分 局部变量和全局变量的区分 2 基本内置类型 有整形 xff0c 实型
  • docker常用命令

    Docker https www docker com 是一个不断发展的系统 xff0c 开发人员主动致力于提高使用率和性能 所以命令总是在变化 Docker命令经常被弃用并替换为新的或更有效的命令 你可以使用help选项检查Docker安
  • 函数指针的好处、作用

    C中函数指针的作用 项目中用到了很多封装在struct中的函数指针 xff0c 以前在MFC里面经常用到则个作为回调函数 xff0c 还以为是微软设计的特色呢 在网上查了一下它的用法 xff0c 做个总结 1 xff09 提供调用的灵活性
  • WPF水平布局和垂直布局

    一 控件水平排列 lt StackPanel Orientation 61 34 Horizontal 34 Grid Row 61 34 1 34 VerticalAlignment 61 34 Center 34 HorizontalA
  • 根据ip和子网掩码判断两个ip是否在同一个子网

    题目描述 xff1a 子网掩码的要求 xff1a 1 xff09 如255 255 255 0 每个整形都不能大于255 转换成二进制的字符串 xff0c 必须前面全为1 xff0c 后面全为0 ip地址的要求 xff1a 1 xff09
  • pom.xml 转换为gradle报错 spring-boot-starter-parent-1.5.9.RELEASE.pom. Return code is: 501

    pom xml 转换为gradle 时候报错 xff1a Execution failed for task 39 init 39 gt Could not convert Maven POM D studentSpace jinxiaoc
  • 笔记本电脑外放声音吱吱响怎么办?

    问题分析 xff1a 1 硬件问题 xff1a 喇叭坏了 2 软件设置问题 xff1a 声音产生冲突了 解决方案 xff1a 当一个喇叭坏了 xff0c 或者两个喇叭的声音冲突了 xff0c 都可以使用如下方式 xff1a 针对于win10
  • mac修改默认终端为iterm2

  • 视频下载4大神器

    1 downie 可以下载 上面所有你想的到的视频网站的视频 xff0c 而且下载速度很快 2 ykdl 可以通过命令行下载爱奇艺的视频 xff0c 还有其他网站的视频 3 you get 4 youtube dl
  • jupyter_notebook_config.py的配置详解

    Configuration file for jupyter notebook Application SingletonConfigurable configuration This is an application The date
  • js Function 参数按值传递详解

    如果传入参数是基本数据类型 xff0c 那么按值传递是很容易理解的 xff1b 如果传入参数是引用数据类型 xff0c 那么会很容易陷入误区 xff0c 错误地认为是引用传递 xff1b 错误例子一 xff1a function setCo
  • 准确率、精准率、召回率和F1值详解

    专业术语的中英文对照表 英文名准确率Accuracy精准率Precise召回率RecallF1值F1 measure Precise和Recall是广泛应用在信息检索和统计学分类领域的两个度量值 xff0c 用来评价结果的质量 xff1b
  • snippet,让你编码效率翻倍

    为什么谈到Snippet 今天下午在用vscode做小程序的时候 xff0c 发现很不方便 xff0c 因为商店里提供的代码片段极为有限 xff0c 而且平时几乎每天都需要用到代码片段 xff0c 所以就在思考他们是怎么做到给别人提供代码的
  • 验证Promise是同步的

    前言 Promise是ES6提出的解决异步编程导致陷入回调的地狱问题 例子1 console log 1 var a 61 new Promise function resolve reject console log 2 resolve
  • Nextcloud下载文件出错、无法下载、网页卡死解决办法

    通常出现这种情况是因为用了一些Nextcloud不支持的下载工具 xff0c 通常需要去下载工具中设置 通过Nextcloud下载大文件的时候1G或更大时 xff0c Internet Download Manager会将系统卡住 xff0
  • 原生js实现JSONP

    介绍 JSONP是JSON with Padding 填充式JSON或参数式JSON 的简写 xff0c 是一种非常常用的跨域请求方式 主要原理是利用了script 标签可以跨域请求的特性 xff0c 由其 src属性发送请求到服务器 xf