在自己的电脑上实现一个JSONP

数据库是什么

相当于是一个文件系统。可以长久地存储数据,就叫做数据库
在这里,用一个文件代表数据库,取名为db(没有后缀),在文件内输入 100 ,保存退出。我们现在要实现一个跨域打钱的功能

JSONP是什么

JSON是一种互联网通用的数据传输格式,P即padding,是包住JSON两边的一部分字符。JSONP可理解为跨域的请求。因为一般来说,在本域名下,是不能访问到其他域名下的资源的,JSONP是民间程序员发明的、用来请求其他域名下资源的工具。

在自己的电脑上如何跨域请求自己的资源?

  1. 安装一个http-server
    因为一般在本地打开一个页面调试的时候,一般都是适应的file资源,但是,有的类型的资源必须是通过http网络协议 才能访问的,可以在电脑上安装一个http-server
    安装方法
    npm install http-server -g
    安装完之后,进入目标文件夹,在命令行输入
    http-server -c-1
    就可以开启一个本地的服务器
    image.png

这两个IP地址看起来很眼熟,第一个是经常用来配置路由器的IP,第二个是电脑自己访问自己的时候的IP,因为前一个IP是路由器产生的,所以,在同一局域网的 手机也可以连接这个这个IP进行调试。

http-server这一部分可以不看,因为只是稍微提一下,我们完全可以自己用node配置一个本地的服务器,实现更多的功能

  1. 接下来修改一下Hosts文件:
    这样可以让自己的电脑在访问一个域名的时候提供一个电脑伪装的ip
  • 如果是Windows系统,进入C:\Windows\System32\drivers\etc,打开hosts文件,在文件里面添加像下图一样的最后两行


    image.png

    随便叫什么 xxx.com什么的域名 都可以,后面需要用,保存退出。

  1. 用node写一个server
第一步,写一个index.html文件,把 js 代码也写在这里面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>jsonp</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h5>您的账户余额是</h5><span id="amount">&&&amount&&&</span>
    <button id="btn">-1s</button>
    <script>
        btn.addEventListener('click', (e)=>{
            let script = document.createElement('script')
            let functionName = 'frank'+ parseInt(Math.random()*10000000 ,10)  // 生成一个随机的函数名
            window[functionName] = function(result){ 
                if (result==='success'){
                    amount.innerText = amount.innerText - 0 - 1  // 避免刷新页面,前端和后台做同样的操作
                }else{
                    console.log('zhelicuol')
                }
                
            }
            // 这里在frank.com:8001下,请求 jack.com:8002的资源
            script.src = 'http://jack.com:8002/pay?callbackName=' + functionName
            document.body.appendChild(script)
            script.onload = function(e){
                console.log('onload')
                e.currentTarget.remove()
                delete window[functionName]  // 无论是否请求成功,都删掉发送过请求的script标签和函数名
            }
            script.error = function(e){
                e.currentTarget.remove()
                delete window[functionName] 
            }
        })
    
    </script>
</body>
</html>

我们把发送JSONP的代码也写在这里,就是通过点击按钮之后,就发送一个请求

第二步,写一个style.css的文件
button{
    background: red;
}

虽然这里给定了button的样式,但是后端并没有前端返回这个文件

第三部,自己用node.js配置后台的文件

因为我们是前端,不需要对这个有过多的了解,只需要明白中间的路由配置方法就可以了,其他部分在需要的时候都可以复制直接用
代码如下

var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

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 pathWithQuery = request.url
  var queryString = ''
  if (pathWithQuery.indexOf('?') >= 0) { queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  var path = parsedUrl.pathname
  var query = parsedUrl.query
  var method = request.method

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

  if (path === '/') {
    var string = fs.readFileSync('./index.html', 'utf-8')
    var amount = fs.readFileSync('./db', 'utf-8')
    string = string.replace('&&&amount&&&', amount)
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write(string)
    response.end()
  } else if(path == '/style.css'){
    response.setHeader('Content-Type','text/css;charset=utf-8')
    response.write('body{color:green;}')  // 后台自己写的css
    response.end()
  }else if (path === '/pay') {
    var amount = fs.readFileSync('./db', 'utf-8')
    var newAmount = amount - 1
    fs.writeFile('./db',newAmount,function err(error) {
      console.log(error)
    })
    response.setHeader('Content-Type','text/javacript;charset=utf-8')
    response.write(`
      ${query.callbackName}.call(undefined,'success')
    `)
    response.end()
  } else {
    response.statusCode = 404
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write('404了')
    response.end()
  }

  /******** 代码结束,下面不要看 ************/
})

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

中间需要看的部分是路由的设置,可以看到,如果用户请求了 /style.css这个路径,后台并没有返回style.css这个文件,而是自己做了一个假的信息响应给浏览器。


image.png

这个时候,文件夹里面有这些文件(README.md是github加的文件,不用管)

使用JSONP
  1. 使用命令行,进入这个目录
  2. 输入 node index.js 8001
  3. 另外再打开一个gitbash(或者其他命令行工具),在这个目录下输入 node index.js 8002
  4. 使用浏览器访问 frank.com:8001 ,点击按钮,就可以让fran.com的域名给jack.com的域名发送。并且接收请求了
JSONP的原理

JSONP不是官方提供的跨域的方法,而是古代的前端程序员为了实现跨域利用script标签自创的一个方法

它的本质上和 页面引入一个 CDN 的jQuery是一样的

如果在页面中写
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js></script>"
浏览器就会下载 https://cdn.bootcss.com/jquery/3.3.1/jquery.js 这个url里面的JS代码,并且将其展示到 html 文件中
这段代码可以是立即执行的,并且它可以完成一些功能

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 1、什么是同源策略? 浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下...
    kumabearplus阅读 268评论 0 0
  • 1. 跨域和同源 首先来看摘自MDN上对于跨域,较为标准的解释: 当一个资源从与该资源本身所在的服务器不同的域或端...
    晓风残月1994阅读 418评论 0 0
  • 1: 什么是同源策略 浏览器出于安全方面的考虑,只允许与本域下(同协议/同域名/同端口)的接口交互。不同源的客户端...
    lingfighting阅读 218评论 0 0
  • 1. 跨域和同源 首先来看摘自MDN上对于跨域,较为标准的解释: 当一个资源从与该资源本身所在的服务器不同的域或端...
    晓风残月1994阅读 213评论 0 0
  • Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同、端口号不同、...
    祈粼阅读 471评论 0 1