使用mui.ajax完成跨域请求

一、代码

mui.ajax({

type:"post",

url: serverip + ‘/api/v1/requestSMS/?jsoncallback=?‘,

async:false,

data: {

mobile: mobile

},

dataType: "jsonp",

jsonp: "jsoncallback",

success: function(data, status, xhr){

console.log("success : "+ data)

return callback();

},

error: function(xhr, type, errorThrown){

console.log("error: " + type);

return callback("获取验证码失败:服务器错误!");

}

});

二、json和jsonp

jsonp的出现是因为浏览器有个同源策略,对js来说,它在执行时不能请求不同源的资源。什么是源呢,这里是指协议名(如http://)+主机名(api.flickr.com)+端口号(:80,http协议默认端口号是80,可省略),这三个组合在一起就是一个源,同源的话是指这3个必须和发起请求的网页的源必须一样。

因为js是不能请求不同源的资源,所以如果你的脚本不在这个源(http://api.flickr.com)的网页上,是没法请求的它的图片的。

但为什么jsonp可以?

那是因为同源策略有个例外,如果网页上通过<script src="不同源的地址"></script>,<img>以及<link>这样的标签来引用不同源的资源是可以的。

结合这个例外,一些(个)聪明的人就想到一个办法,

如果请求资源时,异源服务器能返回这样的脚本,请求异源资源的问题就得到解决:

fnName({theDataUWanted});

因为这样,浏览器得到这个脚本后会立即执行它,而这个函数实际上就是包含了你定义的回调函数的函数,而这个fnName就是jsoncallback参数的值,也就是jQuery自动替换的名字。

这个异源请求的完成,要求异源服务器也必须配合你的脚本才行,如果它不支持jsonp,那即使用jsonp也无法请求异源的资源。

三、json和jsonp的区别

如果服务器端执行代码:

message.setMsg(2, "message value", "content value");

return new ResponseEntity<Message>(message, HttpStatus.OK);

则客户端ajax的dataType设置为json和jsonp时,

success:function(data, status, xhr){

console.log("data:" + data + "data.message:" + data.message);

}

的打印结果分别为:

(1)json:

data:[object Object]

data.message:message value

(2)jsonp:

data: {"code":2,"message":"message value","content":"content value"}

data.message:undefined

四、jsonp原理

首先在客户端注册一个callback, 然后把callback的名字传给服务器。

此时,服务器先生成 json 数据。

然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)

时间: 2024-08-01 06:28:13

使用mui.ajax完成跨域请求的相关文章

原生JS实现Ajax及Ajax的跨域请求

  前  言          如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿.当然,如今有着许多的框架,都有相对应的前后台数据交互的方法. 而,其中,用得最多的应该苏算是JQuery的Ajax了.但是,今天,影子向大家介绍的是原生js的Ajax,及跨域请求. 一. JQuery的Ajax 首先,先回忆下JQuery的Ajax写法: $.ajax({ url: , type: '', dataType: '', data: { }, s

原生JS实现Ajax的跨域请求

原生JS如何实现Ajax的跨域请求? 在解决这个问题之前,我们务必先清楚为什么我们要跨域请求,以及在什么情况下会跨域请求. 了解一下:"同源策略",你就知道了: 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 它的定义是: 一段脚本向后台请求数据,只能读取属于同一协议名.同一主机名.同一端口号下的数据: 所以,请求不同协议名.不同端口号.不同主机名下面的文件时, 将会违背同源策略,无法请求成功,需要进行跨越处理!!

Ajax之跨域请求

一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径'http://127.0.0.1:8000/index/',对应的视图是index视图返回一个index页面,页面中只有一个button按钮,按钮绑定了一个单击事件,点击之后会发送一个ajax请求,请求的路径为'http://127.0.0.1:8001/ajax/',Demo1的ip和端口号是:'http://127.0.0.1:8000/',Demo2的ip和端口号是:'http://127.0

Ajax-07 基于Ajax实现跨域请求

跨域 跨域名访问,如c1.com域名向c2.com域名发送请求 本质:浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. django服务端准备 url.py: from django.conf.urls import url from hello import views urlpatterns = [ url(r'cors/', views.cors, name='cors'), url(r'jsonp/', views.jsonp, name=

ajax j跨域请求sonp

需求 遇到的问题 解决方案 需求 如今,该项目需要获得数据访问外部链接.它是跨域.使用ajax 直提示: 遇到的问题 1. 怎样使用ajax 跨域请求数据 2. 能不能post请求 解决的方法 经过网上查找资料.能使用jsonp请求跨域数据. jsonp请求数据仅仅能get.不支持post跨域请求 用法.见代码: $.ajax({ type: "post",//这里写post也没用,也是get请求 url: "url", dataType: "jsonp&

ajax本地跨域请求以及解决方法

什么是跨域? ??我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没有同时满足这三个条件的请求即为跨域请求,跨域请求控制台一般会出现类似错误: XMLHttpRequest cannot load http://xxxxx.php. No 'Access-Control-Allow-Origin' header is present on the requested reso

Ajax JSON 跨域请求 服务(WebApi,WCF或者其他)

直接来干货. 程式在 单台IIS下工作正常,换到域名下(负载均衡)就开开各种跨域了.研究了下,只要是符合以下条件的,基本上可以通用一种解决方案: 条件是: 1. HTTP方法:GET,Head,POST之外的方法 2. 使用POST方法,而且使用application/x-www-form-urlencoded, multipart/form-data, or text/plain 之外的 Content-Type,例如:以 POST 发送XML.JSON 等 3. 使用自定义头 解决方案: 移

Ajax 跨域请求 jsonp获取json数据

遇到Ajax的跨域请求出问题 找了中解决办法如下: 参考内容:http://justcoding.iteye.com/blog/1366102 由于受到浏览器的限制,该方法不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的

JQuery的Ajax跨域请求的解决方案

http://www.open-open.com/lib/view/open1334026513327.html 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式, 于是即刻翻出Jquery的API出来研究,发现JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的 jquery.ajax jsonp格式和jquery.getScript方式. 什么是jsonp