什么是 JSONP?

2023-11-17

前言

首先我们得先了解JSONP是怎么产生的。
最开始跨域请求数据没有现在方便,Ajax直接请求普通文件存在跨域无权限访问的问题,然后聪明的程序员想出了一套非官方的解决办法,程序员发现凡是带有“src”这个属性的标签都拥有跨域的能力,比如<·img>、<·iframe>、<·script>。
事实上早期的程序员也是这么干的,最后程序员们发现最好的解决办法就是——动态创建script标签发起请求,然后从后端拿到请求回来的数据进行处理,再然后把刚刚创建的script标签删掉,这就是JSONP的整套流程。做完这一切,在用户的角度是感觉不到动态创建script标签以及发送请求的,用户体验非常好,因此JSONP提供了一种各方都很满意的跨域解决方案。
在这里插入图片描述
在这里插入图片描述
页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <title>Title</title>
</head>
<body>
<h5>您的账务余额为<span id="amount">&&&amount&&&</span></h5>
<button id="button">汇款</button>
<script>
    button.addEventListener('click', (e) => {
        let script = document.createElement('script')
        let name = 'json' + parseInt(Math.random() * 100000, 10)
        window[name] = (e) => {
            console.log(e)
            if (e === 'success') {
                amount.innerText = amount.innerText - 1
            }
        }
        script.src = 'http://houduan.com:8002/pay?callback=' + name
        document.body.appendChild(script)
        script.onload = (e) => {
            e.currentTarget.remove()
            delete window[name]
        }
        script.onerror = (e) => {
            alert('fail')
            e.currentTarget.remove()
            delete window[name]
        }
    })
</script>
</body>
</html>

服务器

var http = require('http')
var fs = require('fs')
var url = require('url')
// var port = process.argv[2]
var port = process.env.PORT || 8888

// if(!port){
//     console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
//     process.exit(1)
// }

var server = http.createServer(function(request, response){
    var parsedUrl = url.parse(request.url, true)
    var path = request.url
    var query = ''
    if(path.indexOf('?') >= 0){ query = path.substring(path.indexOf('?')) }
    var pathNoQuery = parsedUrl.pathname
    var queryObject = parsedUrl.query
    var method = request.method

    /******** 从这里开始看,上面不要看 ************/

    console.log('HTTP 路径为\n' + path)
    console.log('pathNoQuery', pathNoQuery)
    if(path == '/'){
        var string = fs.readFileSync('./index.html', 'utf8')
        var amount = fs.readFileSync('./db.txt', 'utf8')//100
        string = string.replace('&&&amount&&&', amount)
        response.setHeader('Content-Type', 'text/html; charset=utf-8')
        response.write(string)
        response.end()
    }else if(path === '/style.css'){
        var string = fs.readFileSync('./style.css', 'utf8')
        response.setHeader('Content-Type', 'text/css; charset=utf-8')
        response.write(string)
        response.end()
    }else if(path === '/main.js'){
        var string = fs.readFileSync('./main.js', 'utf8')
        response.setHeader('Content-Type', 'application/javascript')
        response.write(string)
        response.end()
    }else if (pathNoQuery === '/pay'){
        var amount = fs.readFileSync('./db.txt', 'utf8')
        var newAmount = amount - 1
        fs.writeFileSync('./db.txt', newAmount)
        response.setHeader('Content-Type', 'application/javascript')
        response.statusCode = 200
        response.write(`
            ${queryObject.callback}.call(undefined, 'success')
        `)
        //JSON + 左右padding =JSONP  就是这个意思
        //JSON: {
        //                 "success": true,
        //                 "left": ${newAmount},
        //             }
        response.end()
    }else{
        response.statusCode = 404
        response.setHeader('Content-Type', 'text/javascript; charset=utf-8')
        response.write('找不到对应的路径,你需要自行修改 index.js')
        response.end()
    }
    /******** 代码结束,下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)

JSONP:

请求方:qianduan.com 的前端程序员(页面)
响应方:houduan.com 的后端程序员(服务器)
1.请求方创建script,src指向响应方,同时传一个查询参数 ?callbackName=yyy
2.响应方根据查询参数callbackName,构造形如
(1)yyy.call(undefined, ‘你要的数据’)
(2)yyy(‘你要的数据’)
这样的响应
3.浏览器接收到相应,就会执行yyy.call(undefined,'你要的数据’)
4.那么请求方就知道了他要的数据

这就是JSONP

约定:
1.一般不用callbackName,约定用callback
2.一般不用,约定用随机数 例如:data589844959310093()

$.ajax({
	url: 'http://houduan.com:8002/pay
	dataType: 'JSONP'
	success: function(response) {
		if(response === 'success') {
			amount.innerText = amount.innerText - 1
			}
		}
})

JQuery对其进行的封装,因为调用形式很像ajax,所以JQuery将JSONP封装进ajax中,但请注意!JSONP与ajax不一样!

  • ajax:核心是通过XmlHttpRequest获取非本页内容
  • JSONP:核心是动态添加<-script->标签来调用服务器提供的js脚本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 JSONP? 的相关文章

  • 蓝牙-基础篇-蓝牙简介

    文章目录 蓝牙特点 蓝牙功能 蓝牙的两种技术 蓝牙特点 低功耗 短距离 跨设备 蓝牙功能 跨设备传输流式音频 跨设备传输数据 广播信息 蓝牙的两种技术 传统蓝牙技术 蓝牙版本2 0 2 1 即Basic Rate Enhanced Data

随机推荐

  • 【小沐学C#】C#逆向反编译工具:JetBrains dotPeek

    论道篇 一天 戈戈来到江边静坐凝思 一手放着风筝 一手钓着鱼 微风徐徐 水面粼粼 柳枝招摇 戈戈 论语 读了许多天可有心得 狄狄 错误要么是 过了 要么是 不及 重要的就是把握住度 戈戈 程朱理学常说格物致知 那些红绿线平时可格出了些什么
  • C语言程序设计 程序设计与C语言

    1 计算机与程序 程序设计语言 机器语言又称低级语言 意思是贴近计算机硬件的语言 是一个型号机器语言的指令的集合 是紧密依赖于计算机的硬件 高级语言用于程序设计 编译系统的软件事先把高级语言编写的程序翻译成机器语言程序 2 C语言的出现和发
  • three.js 内置的几何体Geometry

    案例效果 所有案例效果地址 前言 前面我们了解了 一个three js三大基础renderer camera scene和响应式three js 现在我们来学习一下three js内置的geometry three js提供了很多的几何体给
  • 【PTA】二维数组转置

    写一个程序 使给定的一个二维数组 n n 转置 即行列互换 输入格式 输入n表示n行n列 再输入一个nxn的矩阵的整数 输出格式 转置的结果 输入样例 3 1 2 3 4 5 6 7 8 9 输出样例 1 4 7 2 5 8 3 6 9
  • 1007 素数对猜想

    让我们定义dn为 dn pn 1 pn 其中p是第i个素数 显然有d1 1 且对于n gt 1有dn 是偶数 素数对猜想 认为 存在无穷多对相邻且差为2的素数 现给定任意正整数N lt 10 5 请计算不超过N的满足猜想的素数对的个数 输入
  • 嵌入式的七种接口

    我们将简要介绍七个串行接口 SIO UART SSP SPI I2C CAN USB和EtherMAC 虽然每个接口都有几个不同的操作模式 但我们只介绍一个典型的模式 因此 本文的解释不适用于其它操作模式 摘自东芝 SIO 串行输入输出 最
  • Nginx使用多个.conf文件配置虚拟主机server

    使用 Nginx 配置多个虚拟机 server 服务 通常做法可以直接在 nginx conf 文件中添加即可 如下事例 nginx conf worker processes 1 events worker connections 102
  • Eva 剧情解析

    Eva 剧情解析 来源 https zhuanlan zhihu com p 20864898 0 写在前面的话 相信和我年龄差不多的小伙伴们对 新世纪福音战士 Neon Genesis Evangelion 以下简称 EVA 一定不陌生
  • 动画中英文对照表(09.24)

    ID 英语名 中文名 作者 日语名1 hack Legend of Twilight s Bracelet hack 黄昏的腕轮传说 2 hack Liminality in case of AIHARA Yuki hack OVA版 3
  • 【分类模型评价】宏平均(macro avg)、微平均(micro avg)和加权平均(weighted avg)

    当我们使用 sklearn metric classification report 工具对模型的测试结果进行评价时 会输出如下结果 对于 精准率 precision 召回率 recall f1 score 他们的计算方法很多地方都有介绍
  • Scratch中的坐标系

    Scratch中的坐标系即普通的平面坐标系 其中水平方向为x轴 竖直方向为y轴 x轴与y轴交点为 0 0 点 x轴正方向为水平向右 y轴正方向为竖直向上 舞台默认大小为宽480 高360 其中x轴范围是 240 240 y轴范围是 180
  • 该产品与此版 VMware Workstation 不兼容,因此无法使用

    目录 VMware虚拟机开机报错 解决错误 VMware虚拟机开机报错 配置文件 D Users tyn Documents Virtual Machines Ubuntu16 的克隆 Ubuntu16 的克隆 vmx 是由 VMware
  • intellij idea开发环境下使用jetty跑项目修改js、jsp文件提示Cannot Save Files 问题

    问题描述如题 试了好久终于找到解决办法 记录下来与大家分享 1 首先进入你的maven仓库找到jetty的位置 我的位置在 C Users ccpit m2 repository org mortbay 供大家参考 2 进入jetty目录
  • DrawerLayout+ToolBar

    ToolBar自定义图标 关联DrawerLayout http blog csdn net static zh article details 52621240 Android侧滑菜单DrawerLayout的使用 http blog c
  • (休息几天)读曼昆之微观经济学——供给需求和政府政策

    1价格上限的短期效应和长期效应 价格上限的一个常见例子是租金管制 在很多城市 当地政府部门规定了房东对租房者索要的最高价格上限 该政策的目的是帮助穷人能租得起房子 经济学家通常痛批租金管制政策 认为它是一种非常缺乏效率的帮助穷人提高他们生活
  • QT信号与槽机制解析

    信号 Signal 与槽 Slot 是Qt编程的基础 有了信号与槽的编程机制 在Qt中处理界面各个组件的交互操作时变得更加直观和简单 GUI程序设计的主要内容就是对界面上各组件的信号的响应 只需要知道什么情况下发射哪些信号 合理地去响应和处
  • 持续增加时间价值30条

    今天分享阅读 时间价值 第一章时的笔记 持续增加时间价值30条 1 当你认为时间在帮助自己的时候 就觉得他是自己的朋友 当你有了要做的事情 当你在确定的方向上往前走 那么时间是在累积我们的成果 就是在帮我们的忙 2 在大的时间面前不要做太小
  • [深入研究4G/5G/6G专题-45]: 5G Link Adaption链路自适应-1-总体架构

    目录 第1章 链路自适应技术概述 1 1 概述 1 2 链路自适应技术的类型 1 3 基本概念
  • 电信行业BOSS系统

    BOSS系统 是Business Operation Support System的简称 即业务运营支撑系统 通常所说的BOSS系统分为四个部分 计费及结算系统 营业与账务系统 客户服务系统和决策支持系统 BOSS系统从业务层面来看就是一个
  • 什么是 JSONP?

    前言 首先我们得先了解JSONP是怎么产生的 最开始跨域请求数据没有现在方便 Ajax直接请求普通文件存在跨域无权限访问的问题 然后聪明的程序员想出了一套非官方的解决办法 程序员发现凡是带有 src 这个属性的标签都拥有跨域的能力 比如 l