什么是 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? 的相关文章

  • 30天精通Nodejs--第十四天:MongoDB

    这里写目录标题 前言 什么是 MongoDB 安装 MongoDB 驱动 连接到 MongoDB 数据库 执行基本操作 插入文档 查询文档 更新文档 删除文档
  • 正确的 JSONP 响应

    我正在本地尝试让 JSONP 给出正确的响应并将其传递到我的回调函数 jsonp callback 中 使用以下代码 如何设置 JSONP https stackoverflow com questions 9519209 how do i
  • jsonp 没有在发送之前触发?

    我正在开发一个项目 使用 ajax 并将 dataType 设置为 jsonp 从不同域调用 Web 服务 ajax type GET url testService asmx async true contentType applicat
  • 如何使用带有基本身份验证的 JQuery 进行 JSONP 调用?

    使用 JQuery 我如何调用需要基本身份验证的 JSONP API 我可以通过编程方式处理这个问题 还是用户必须进行交互并在登录对话框中输入用户名和密码 JSONP 请求不使用 XMLHttpRequest 对象 系统 因此没有办法直接做
  • AngularJS 中的 401 未经授权的错误处理

    我是 AngularJS 的新手 现在花了 3 天寻找处理 401 状态的方法 我尝试过拦截器 使用 http 使用 resource 但没有任何效果 我的应用程序在同一服务器上调用 JSONP 调用 当错误发生时 它会被错误回调函数捕获
  • SoundCloud API 给出“Uncaught SyntaxError: Unexpected token:”错误

    在控制台中 它给我错误 Uncaught SyntaxError Unexpected token 但如果我在浏览器中直接访问 SoundCloud URL 那么它会给出有效的 JSON 早些时候 这段代码运行良好 今天这个问题开始出现 h
  • 使用 jquery + jsonp,Internet Explorer 不保存 ASP.NET sessionID

    所以我正在使用 Jquery 做一些相当简单的 JSONP 东西 总体结构 网站存在于域中A JavaScript 存在于域中B JSON 服务也存在于域中B 该站点调用 jsonp 调用 json 服务 net 的方法 在 net 中我设
  • 使用 jQuery 1.5 以 jsonp 形式发送请求,将响应解释为文本

    简短的问题 有没有办法向服务器发出 jsonp 请求 捕获请求 但不将其解析为 javascript 我在 jQuery 1 5 中使用 dataType jsonp text 但它不起作用 我正在尝试使用 jsonp 通过 AJAX 访问
  • Jquery 成功函数未使用 JSONP 触发

    一直在使用 jQuery 调用我的服务 该服务位于不同的域中 对服务的调用已成功进行 我的调试点被触发 并且返回了正确的响应 我嗅探了流量 我的问题主要是成功和失败回调不会被触发 我读过一些其他帖子 https stackoverflow
  • vue2项目实现excel文件导入导出和拖拽上传

    文章目录 一 excle文件导出 二 excel文件导入 三 文件拖拽上传 四 完整代码 文件导入导出实现逻辑图 一 excle文件导出 导出员工接口返回的是二进制流 axios配置responseType为blob接收二进制流文件为Blo
  • 如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?

    我编写了一个返回 JSON 的 Web 服务 并尝试使用 jQuery 调用它 如下所示 ajax contentType application json charset utf 8 url http examplewebsite com
  • jQuery .ajax() 与 jsonp 不调用成功回调函数

    我有一个 facebook iframe 应用程序 它向我的服务器发出跨域请求并请求 JSONP 格式的数据 这是我的客户端代码 jQuery ajax url type post data method set user prizes d
  • php中如何检测ajax跨域请求

    对于普通的ajax请求我使用 strtolower SERVER HTTP X REQUESTED WITH xmlhttprequest 但这不适用于跨域请求 我能怎么做 Edit2 如果您以这种方式使用 jQuery ajax 函数 v
  • 将 Typeahead 与 Google 自定义搜索引擎结合使用

    我正在尝试让 Twitter Typeahead Bloodhound 与 Google 的 CSE 配合使用 到目前为止 我已经成功返回结果 但无法计算出 datumTokenizer var results new Bloodhound
  • 如何在 AngularJS 中插入命令或阻止 $http 的 JSONP 自动解析?

    似乎我发现的关于 http 或 angularjs 的几乎每个问题或解释通常都假设您可以修改请求的响应 我不能这样做 而且我得到的响应格式错误 根据 AngularJS 解析器 它的格式错误一致 因此我可以在解析纯文本之前修改它来解决问题
  • jQuery AJAX JSONP 错误“意外的令牌”

    我正在尝试跨域JSONP在 Chrome 中打电话 但我总是回复 未捕获的语法错误 意外的标记 我尝试过 更改响应内容类型 设置 xhr 标头 JSON stringify 几乎是此处提供的大多数解决方案 但到目前为止没有任何效果 ajax
  • JQuery - $.ajax() - 使用 JSONP 跨源 - 仅在 IE 8 中获取“parsererror”(在 IE 7 中工作)

    我有以下代码来执行跨域请求并获取 JSONP 数据 通过回调方法包装的 JSON 我已经验证我使用包装 JSON 数据的回调方法正确获得了响应 它在 IE7 中工作得很好 回调 cb 被调用 但在 IE8 中则不然 document rea
  • jQuery JSONP ajax,未设置身份验证标头

    我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求 ajax url https www opensocial googleusercontent com api people me all dataType js
  • 在成功回调之前修改 JSONP 结果

    我想从外部服务加载一些 JSON 数据 然而 它提供 foo bar useful 而我真正关心的是 有用 的部分 我需要将那部分传递给success打回来 我正在尝试使用Deferred一次从多个数据源加载 类似this https st
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 【小沐学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