JSONP与JSON只有一字之差,我们在使用Jquery的Ajax调用的时候也是使用相同的方法来调用,两者的区别几乎只在于使用的dataType这个属性的不同。但是实际上JSON和JSONP是完全不同的两个东西,JSON是一个数据格式,就好像XML一样,JSONP适用于解决远程调用本地回调函数跨域的问题。

当指定dataType为JSON的时候,回调函数的参数(success:function(data)里面的data)是一个JSON格式的数据字符串,类似于“{‘NAME’:'ckym','Age':27}”,在success中定义处理这个数据的逻辑。

当指定dataType为JSONP的时候,回调函数的定义是一样的,但是服务器返回的就不是一个JSON的数据了,而是一个调用的方法字符串,例如“showMessage(JSON.stringify(data))”,此时,ajax就会调用success后面定义的方法来代替这个这个showMessage方法。

所以不管是JSON还是JSONP,处理代码的逻辑都定义在success这个回调函数中。

下面是一个实例程序(基于NodeJS,需要安装Express,当然其他的开发语言也是一样的道理)。

Server端:

var express=require('express');
var app=express();

app.get('/',function(req,res,err){
    var data=[{"Name":'ckym',"password":'12345678'}];//数据格式必须使用双引号,否则会报错
    
    var result="showMessage("+JSON.stringify(data)+")";
    
    res.end(result);
})

app.listen('8001',function(err){
    if(err){
        console.log(err);
    }else{
        console.log("客户端在8001端口监听成功!");
    }
})

Client端:

var express=require('express');
var path=require('path');
var app=express();

app.get('/',(req,res,err)=>{
    res.sendFile(path.join(__dirname,'Main.html'));//注意sendFile必须使用绝对路径,否则程序会报错
})

app.use(express.static('Scripts'));//路径不区分大小写

app.listen(8000,(err)=>{
    if(err){
        console.log(err);
    }else{
        console.log('端口8000监听成功!');
    }
})

Html页面(Main.html):

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'/>
        <title>JSONP测试</title>
        <script src='/JS/jquery-3.2.1.min.js'></script>
    </head>
    <body>
        <h2>这是一个NodeJs的JSONP测试项目</h2>
        <script>
        $(document).ready(function(){
            $.ajax({
                url:'http://localhost:8001/',
                dataType:'jsonp',//此处如果使用json的话就会出现error的报错,是因为XMLHttpRequest不支持跨域访问
                //所以会报错,为解决这个问题,需要使用JSONP的数据类型,script等元素节点的src属性是自带跨域访问的
                //功能,所以也能用来解决跨域问题
                type:'get',//JSONP只支持get方法请求
                jsonp:'callback',
                jsonpCallback:"showMessage",//定义jsonp执行的回调函数的名称--与服务端返回的数据中的方法的名称相同
                success:function(data){
                    alert("这是一个跨域调用方法的数据:"+JSON.stringify(data));
                },
                error:function(err){
                alert("ajax出现错误,请联系管理员!:"+JSON.stringify(err));
                }
            })
        })
        </script>
    </body>
</html>

使用NODEJS实现JSONP的实例的更多相关文章

  1. nodejs+express+ejs+mongoose实例

    nodejs+express+ejs+mongoose实例 nodejs学得异常痛苦,在这里将学的东西做一番整理,算是自我安慰吧.根据网上todo示例,用express和mongoose重写了部分代码 ...

  2. jsonp 演示实例 —— 基于node

    序 同源策略是浏览器处于安全考虑,为通信设置了"相同的域.相同的端口.相同的协议"这一限制.这让我们的ajax请求存在跨域无权限访问的问题. 同时我们发现script标签引入脚本的 ...

  3. Jsonp理论实例代码详解

    什么是Json?JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...

  4. jsonp调用实例

    首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&callback=showPricesymbol是请求条件, ...

  5. JavaScript跨域请求和jsonp请求实例

    <script type="text/javascript" src="./whenReady.js"></script> <sc ...

  6. Nodejs后台管理员登录实例

    思路: 直接访问后台页面时如果无session则跳转到404 当在登录页的表单提交时对数据库进行匹配,匹配成功生成session,否则提示用户名或密码错误 准备页面 :后台首页.登录页.404页, 步 ...

  7. 百度搜索关键词联想API JSONP使用实例

    许多搜索引擎都提供了关键词联想api,且大多数都是jsonp. Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获 ...

  8. Struts2的jsonp接口实例

    和以往写struts2程序一样,action方法跳转到一个JSP中,为了配合jsonp的跨域,要在JSP中做一个输出 JSP: <%@ page language="java" ...

  9. php下的jsonp使用实例

    参考资料:http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html 测试依赖条件: 项目eetopinOfficial 在hosts ...

随机推荐

  1. Hotspot对象的内存布局

    对象头 class oopDesc { ... private: volatile markOop _mark; union _metadata { Klass* _klass; narrowKlas ...

  2. Redis的内存回收策略和内存上限(阿里)

    还有一篇文章 讲解guava如何删除过期数据的,与redis不同,guava没有维护线程删除过期key,只是在设置 key 或者 读取key的时候,顺带删除参考:GuavaCache简介(一)是轻量级 ...

  3. Django实现自动发布(3发布-安装)

    相对于服务的升级.回退,新部署一个服务要复杂一些,要满足以下要求: 已经运行了服务实例的主机不能重复部署 进程启动需要的配置文件要先同步到主机上 之前的升级.回退都是指进程的操作,不涉及配置文件的变更 ...

  4. 安装tensorflow-gpu2.0(windows)

    anaconda安装见前一篇https://www.cnblogs.com/wintersoft/p/11609188.html https://mirrors.tuna.tsinghua.edu.c ...

  5. 如何完美更换WordPress网站的域名

    前几天,一位WordPress王牌主机的用户问我,他的WordPress网站已经建立一年多了,现在想要修改网站使用的域名,该如何操作?这是WordPress用户经常遇到的问题.今天我们来给大家介绍一下 ...

  6. INDY10 BASE64编码

    INDY10 BASE64编码 DELPHI自带的BASE64单元,在项目中使用发现非常没有效率,INDY10的好用. uses IdCoderMIME BASE64编码类:TIdEncoderMIM ...

  7. Win10登陆界面卡住,进去后无法打开网络相关的设置,谷歌浏览器无法上网

    今天Win10抽风,进入登录页面输入用户名和密码之后,大约过了10分钟才进入桌面.重启后仍然如此. 经过调查,问题主要出在网络相关模块上,网络无法正常初始化,导致登录一直卡在网络初始化上. 解决方法如 ...

  8. macOS 10.15 Catalina xxx.app已损坏,无法打开,你应该将它移到废纸篓解决方法

    原文连接:https://www.macwk.com/article/mac-catalina-1015-file-damage 更新macOS 10.15 Catalina后,很多在10.14上可以 ...

  9. 向net core 3.0进击——多平台项目发布与部署

    前言 在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的,那就没啥说的了,Come On ...

  10. Spark SQL里concat_ws和collect_set的作用

    concat_ws: 用指定的字符连接字符串 例如: 连接字符串: concat_ws("_", field1, field2),输出结果将会是:“field1_field2”. ...