很久没有更新博客了,毕业2个月了,这段时间一直在忙于工作,一直没有时间更新,最近做的活动突然发现之前的经验居然忘记了。。。索性想想还是重新开始用博客记录平日里的工作经验吧,吐槽就到这里了,这篇记录的是我在平日里经常用到的请求后端的方式。

大多数情况下,无论是框架还是自己实现都是通过Ajax的方式来向后端请求数据的,而Ajax之间是通过传输json格式的文件来进行数据的传输的,大家对Ajax也很熟悉了,那么为什么我又要使用jsonp呢?这就要从什么是jsonp,什么是json来说一说了。

json是一种格式,而jsonp是一种调用方式,那么在大家都使用Ajax的情况下为什么我不用呢?因为Ajax作为脚本出于安全的考虑,是不允许访问非同源的内容的。那么如果我的前端活动页面和后端的服务器不在一个域名下该如何请求数据呢?这个时候就需要jsonp的方式来解决跨域的问题了。

那么为什么jsonp可以跨域呢?其中的原理又是什么呢?我们下面就来介绍一下jsonp跨域的原理。

因为同源策略的的原因,对于一个浏览器的页面只有来自一个源的脚本才可以被执行,这样的目的是为了安全性,可是却阻止了数据的请求,所以我们就要从绕开同源策略来入手,什么情况下允许跨域请求呢?那就是静态资源!静态资源是不受域策略限制的,可以加载任意域的脚本、样式、图片等静态资源,JSOP就是利用这种原理来实现跨域获取数据的。

我们将需要的json数据放在js文件中进行传输,这样就可以将需要的数据通过静态文件的形式传过来了,那么我们就来讲讲具体是如何实现的呢?

由于是静态文件,所以我们在请求的时候首先需要建立一个静态资源的DOM元素,例如这样的标签:

<script src="http://cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>

那么我们就来一步步的构建这个DOM标签吧,首先通过document.createElement(‘script’);来建立一个script标签,然后设置它的src属性指向需要请求的URL地址,然后将这个元素添加在body中,最后出于安全我们要将刚刚新建的标签在完成请求后删除掉。

在这里我把我写的一个封装好的函数贴出来,很简单的一个函数就说明了一切~

/*
* Created by jonnyf on 15-9-15.
* 这个函数是通过JSONP的方式请求后端接口
* 需要传入三个参数,
* url为请求的接口地址,类型为字符串
* parameter为请求的参数对象,类型为对象
* callback为完成请求后的回调函数名称, 类型为字符串
*/ function getJSONP(url, parameter, callback) {
var Script = document.createElement('script'),
_parameter = parameter,
_url = url,
_callback = callback,
code = '';
for (var i in _parameter) {
code += i + '=' + _parameter[i] + '&'
}
Script.src = _url + '?' + code + 'callback=' + _callback;
document.body.appendChild(Script);
Script.onload = function(){ // 请求成功后移除标签
Script.remove();
}
Script.onerror = function() { // 失败的时候也要移除标签
alert('请求错误, 请重试');
Script.remove();
};
}

太久没有记录了。。。已经忘记了太多了,这篇就先简单的记录一点点吧,逐渐再恢复常写博客的习惯了~~

最后祝大家中秋节快乐~<( ̄▽ ̄)> ~~

我的前端故事----Ajax方式和jsonp的实现区别的更多相关文章

  1. 前端之ajax

    前端之ajax 本节内容 ajax介绍 原生js实现ajax jquery实现ajax json 跨域请求 1. ajax介绍 AJAX(Asynchronous Javascript And XML ...

  2. 第七篇:web之前端之ajax

    前端之ajax   前端之ajax 本节内容 ajax介绍 原生js实现ajax jquery实现ajax json 跨域请求 1. ajax介绍 AJAX(Asynchronous Javascri ...

  3. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  4. 跨域请求方式之Jsonp形式

    在浏览器端才有跨域安全限制一说,而在服务器端是没有跨域安全限制的. 在两个异构系统(开发语言不同)之间达到资源共享就需要发起一个跨域请求. 而浏览器的同源策略却限制了从一个源头的文档资源或脚本资源与来 ...

  5. Ajax请求利用jsonp实现跨域

    跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资 ...

  6. js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

    最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下 ...

  7. OSS web直传 ajax方式 上传图片、文件

    部分js代码 send_request = function(){//这是从后台获取认证策略等信息. var htmlobj=$.ajax({url:root+"/service/polic ...

  8. AJAX方式发送远程请求报错:No 'Access-Control-Allow-Origin' header

    AJAX GET方式发送远程请求,chrome开发者工具console中报错:XMLHttpRequest cannot load http://www.shikezhi.com/ajax/getDa ...

  9. ajax方式下载文件

    在web项目中需要下载文件,由于传递的参数比较多(通过参数在服务器端动态下载指定文件),所以希望使用post方式传递参数.通常,在web前端需要下载文件,都是通过指定<a>标签的href属 ...

随机推荐

  1. android3D动画,绕y轴旋转

    原文地址:http://blog.csdn.net/x_i_a_o_h_a_i/article/details/40449847 其实网上的3D旋转的例子很多,在这里我只是想把其代码做一个解释. 先上 ...

  2. python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))

    报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...

  3. python基础七

    subprocess subprocess是专门用来替代os.system;os.spawn更加的先进. 但是subprocess.run()是在python3.5之后才出现的 实例 >> ...

  4. MySQL详解--锁

    http://blog.csdn.net/xifeijian/article/details/20313977 2014-03-06 23:45 66484人阅读 评论(17) 收藏 举报  分类: ...

  5. [恶趣味]搞了下局域网内的arp网络欺骗

    挺无聊的. 扫描,伪装,抓包. 基本上搞完就失去乐趣了. 文章在这里,想搞的可以自己拿去搞下,其实很无聊,我真是个很容易无聊的人啊.

  6. 使用ngrok将内网映射为外网

    如何将自己的本地服务器映射到外网上去?我们可以使用ngrok这个工具,下载地址:http://pan.baidu.com/s/1slnMwPn 具体的操作步骤如下: 第一步.下载客户端我们建议下载的时 ...

  7. 【原创】node+express+socket搭建一个实时推送应用

    技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...

  8. dubbox rest服务

    1.xml配置: web.xml 定义监听的contextpath,见rest协议定义 <servlet> <servlet-name>dispatcher</servl ...

  9. CentOS7 编译安装 nginx-1.10.0

    对于NGINX 支持epoll模型 epoll模型的优点 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的 ...

  10. SimpleXML操控XML

    复杂字符串如下: $_xml=<<<_xml <?xml version="1.0" encoding="utf-8"?> < ...