这是jquery api文档对跨域请求的解析:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用JSONP类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。

我们通过demo来参悟上面的解析:

                $.ajax({
type: "get",
url: "http://www.yourdomain.com/site/test",//实际上访问时产生的地址为: http://www.yourdomain.com/site/test?callback=jsonpCallback&id=1
data: { id: },
dataType: "jsonp",
success: function (data) {
alert(data.statu);
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});

上面就是一个最简单的跨域访问请求了。好了,来说说跟普通ajax的区别。首先实际上访问时的地址为:

 http://www.yourdomain.com/site/test?callback=随机数&id=10。参照api定义:
使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。

这个随机数是jQuery自动生成的。采用jsonp类型情况下,最终生成的url就是如此的。

接下来,看看后台:

服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。

这是服务器(C# MVC)的代码:

        [HttpGet]
public string test(string callback, string id)
{
return callback + "(" + "{\"statu\":" + id + "});";
}

一个有效的JSONP请求,需要在JSON数据前加上回调函数名。回调函数名是上面url中callback传递过来的值。此时服务器传递过来的值为:

jQuery18308788135794457048_1419557549884({"statu":""});

alert(data.statu);也能正确的输出“1”。有人会说json数据前还有回调函数名么,不用处理也能正常输出data.statu??是的,这就是JSONP。

至此,API的前3句已经解析清楚了。就剩后半句了。上面的callback是jQuery随机生成的,回调函数名也是固定为callback,倘若用户要自己定义呢?这就需要用到最后一句话了。

如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。

ajax代码如下:

                $.ajax({
type: "get",
url: "http://www.yourdomain.com/site/test",//实际上访问时产生的地址为: http://www.yourdomain.com/site/test?mycallback=jsonpCallback&id=1
data: { id: },
dataType: "jsonp",
jsonp: "mycallback",
jsonCallback: "jsonpCallback",
success: function (data) {
alert(data.statu);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
} });

看到代码应该懂了吧。jsonp属性是设置传递过去的请求参数名的。jsonCallback属性则是自定义传递过去的参数。此时实际访问的url为:

http://www.yourdomain.com/site/test?mycallback=jsonpCallback&id=1

接下来就不细说了。后台接收代码:
        [HttpGet]
public string test(string mycallback, string id)
{
return mycallback + "(" + "{\"statu\":" + id + "});";
}

接收过来的数据:

jsonpCallback({"statu":""});

强调一下的就是。JSONP类型 ajax只支持get请求,post请求的情况已经测试过,是不行的。

至此,api的解析全部解析透了。

接下来,就是曲折版了。

        function test() {
alert("I am back~~");
}
$.ajax({
type: "get",
//async: false,
url: "http://www.yourdomain.com/site/test", //实际上访问时产生的地址为: test?callback=jsonpCallback&id=10
data: { id: },
cache: false, //默认值true
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback:"test",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//如果这里自定了jsonp的回调函数,则回调函数先起作用,后是success函数
success: function (data) {
alert(data.statu);
//alert(json.message);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});

假如你传递过去的jsonpCallback参数为一js函数的话,也是可以的。成功回调之后,会首先调用jsonpCallback函数,然后是success函数。也就是会先alert("I am back~"),后alert(10)。

注意:jsonpCallback属性不能为匿名函数。即不能如下:

          $.ajax({
type: "get",
//async: false,
url: "http://www.yourdomain.com/site/test4", //实际上访问时产生的地址为: test4?callback=undefinedk&id=10
data: { id: },
cache: false, //默认值true
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback: function () { },
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//如果这里自定了jsonp的回调函数,则回调函数先起作用,后是success函数
success: function (data) {
alert(data.statu);
//alert(json.message);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});

这样的话,能正常返回。但是会先跑匿名函数,然后跑error函数。

jquery Ajax跨域请求的更多相关文章

  1. NodeJ node.js Jquery Ajax 跨域请求

    Jquery + Ajax 跨域请求 说白了就是前台请求ajax数据(JSON)但是请求的数据不在本地的绝对路径下,接口数据 是没有这个安全性的我对外公开的接口数据,只要你找到接口你就可以使用里面的数 ...

  2. jQuery ajax跨域请求的解决方法

    在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...

  3. jquery ajax跨域请求详解

    本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...

  4. jquery+ajax跨域请求webservice

    最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...

  5. jQuery AJAX 跨域请求

    跨域请求 只要 dataType : 'jsonp',  jsonp:"jsoncallback",  然后返回一个json格式的就可以了 <!doctype html> ...

  6. jquery.ajax 跨域请求webapi,设置headers

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 1.第一步 服务端 ...

  7. 关于jquery ajax跨域请求获取response headers问题

    背景:最近项目jwt用户认证方式,关于jwt本人就不再赘述,大家可自行百度. jwt token基本流程是这样的: 用户使用用户名密码来请求服务器 服务器进行验证用户的信息 服务器通过验证发送给用户一 ...

  8. jquery ajax跨域请求后台的简单例子

    一.简介AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. ajax() 方法通过 HTTP 请求加载远程数据. 该方法是 jQuery 底层 AJAX 实现.简 ...

  9. jquery ajax跨域请求webservice webconfig配置

    <configuration> <system.web> <compilation debug="true" targetFramework=&quo ...

随机推荐

  1. elasticSearch Java Spring Data Api

    1. BoolQueryBuilder qb=QueryBuilders. boolQuery(); qb.should(QueryBuilders.matchQuery("keyWord& ...

  2. java代码---I/O文件内容复制

    总结:主要是弄清输入流,输出流 输入流和输出流都是针对程序而言,把文件内容读取到程序是输入流 从程序把内容写入文件是输出流 package com.a.b; import java.io.*; imp ...

  3. solr核心概念、配置文件

    Document Document是Solr索引(动词,indexing)和搜索的最基本单元,它类似于关系数据库表中的一条记录,可以包含一个或多个字段(Field),每个字段包含一个name和文本值. ...

  4. ehcache介绍

    EHCache是来自sourceforge(http://ehcache.sourceforge.net/) 的开源项目,也是纯Java实现的简单.快速的Cache组件.EHCache支持内存和磁盘的 ...

  5. STL算法与树结构模板

    STL算法 STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单如for_each(遍历)到复杂如stable_sort(稳定排序),头文件是:#include <algorithm ...

  6. 杂项:Vue.js

    ylbtech-杂项:Vue.js Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据 ...

  7. 导入和导出eclipse代码格式化模板

    导入和导出eclipse代码格式化模板 导出格式化代码模板:

  8. i2c驱动程序全面分析,从adapter驱动程序到设备驱动程序

    开发板    :mini2440 内核版本:linux2.6.32.2 驱动程序参考:韦东山老师毕业班i2c 内容概括: 1.adapter client 简介    2.adapter 驱动框架   ...

  9. 判断和调整library cache,data dictionary cache,buffer cache性能

    Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据.sga分为好多组件,比如shared pool,buffer cache,redo log buff ...

  10. Cocos2d-html5帧动画

    单独获取plist里面一个文件: cc.SpriteFrameCache.getInstance().addSpriteFrames(s_test_plist); var spriteTest2 = ...