基于jQuery的ajax对WebApi和OData的封装

WebApi 的使用带来了一个显著的特点,对type有一定的要求。一般ajax的type无非就是两种,GET和POST。如果用JSONP来跨域的话,就只能用GET。但是现在WebApi来了,type的类型增加了一倍还要多。这个虽说问题不大,就是多个put、delete,看看要求掌握一下就可以了。但是我觉得,这个总是要有个过程,另外写代码的时候还要想想是put还是post,万一写错了,就会带来不必要的麻烦。那么能不能封装一下呢?

  jQuery的ajax使用其实已经很简单了,但是还是需要设置几个参数,那么能不能在简洁一点呢?或者说有没有必要在封装一下?

  这个就是仁者见仁智者见智的问题了,另外还要看环境,看需求。简单的需求确实没有必要再次封装,直接用就好了。如果需求复杂了一点,那么封装一下也是有必要的。

我们还是先来看看要求

1、  WebApi对type有要求。

2、    OData有自己的使用方式和语法格式。

在看看目标:

1、  使用简单。

2、  便于更改。

3、  便于更换。

  WebApi 刚才说过了,OData呢,确实很强大也很灵活,只是太灵活了,导致增加了学习成本和时间,那么能不能也封装一下,变成大家熟悉的方式呢?

思路

  可能有人看到这个图后回想:我k,用得着这么复杂吗?过度设计吧。其实这个看个人的经历了,经历过的就很容易理解,没经历过的就会很奇怪。最近在看清培兄的大作,就觉得挺奇怪,为啥要这么设计呢?其实是我没有那样的经历,也许以后就理解了吧。

封装方式

  公用属性的封装,就要看实际需求了,比如我的项目里需要对租户ID进行处理,对head里的Authorization的处理(存储token)、cors跨域的处理,访问成功后的统一处理,失败后的统一处理等。

  查询的封装,这个就比较复杂一点,因为有OData,要对他的语法有一个通用的“翻译”,让不会OData的人也能够快速掌握。最后达到,让人感觉不到有OData的存在。这样做便于切换,OData是很强大,但是并不意味着一定会一直使用OData,哪天不用了,客户端的调用代码总不能也跟着大变脸。由于刚刚接触OData,所以封装也是刚刚开始尝试,肯定很多不完善的地方,感觉大家的多多指教!谢过了先。

  添加和修改的封装就比较简单了,设置好type也就没啥事情了,然后可以根据自己的实际情况加点辅助功能,比如设置ID,设置租户ID等。

  删除呢,看着简单,但是实际上是相当的复杂。简单的说,提交一个请求就完事了;复杂的说呢,是物理删除还是逻辑删除,删除前要不要做数据完整性的判断,要不要做级联删除。目前呢只是简单的封装了一下。

这次封装,时间比较紧迫,另外对新项目的理解还不够,比如api的路由规律还没有掌握,本来还想封装一下URL,但是只能暂时放弃了。

  1 //对ajax的封装 //最基础的一层封装
2 Nature.Ajax = function(ajaxInfo) {
3
4 //定义默认值
5 //type: "GET", //访问方式。
6 //dataType: Nature.AjaxConfig.ajaxDataType, //数据类型:JSON、JSONP、text
7 //cache: true, //是否缓存,默认缓存
8 //urlPara: {},//url后面的参数。一定会加在url后面,不会加到form里。
9 //formData: {},//表单里的参数。如果dataType是JSON,一定加在form里,不会加在url后面;如果dataType是JSONP的话,只能加在url后面。
10 //url: //依靠上层指定
11
12 //补全ajaxInfo
13 //cache
14 if (typeof ajaxInfo.cache == "undefined") ajaxInfo.cache = false;
15
16 //type
17 if (typeof ajaxInfo.formData == "undefined") {
18 //ajaxInfo.type = "GET";
19 } else {
20 //ajaxInfo.type = "POST";
21 ajaxInfo.data = ajaxInfo.formData;
22 }
23
24 //处理URL和参数
25 if (typeof ajaxInfo.url != "undefined") {
26 //var tmpUrlPara = "";
27 //var para = ajaxInfo.urlPara;
28 //for (var key in para) {
29 // tmpUrlPara += "&" + key + "=" + para[key];
30 //}
31
32 //if (ajaxInfo.url.indexOf('?') >= 0) {
33 // //原地址有参数,直接加
34 // ajaxInfo.url += tmpUrlPara;
35 //} else {
36 // //原地址没有参数,变成?再加
37 // ajaxInfo.url += tmpUrlPara.replace('&', '?');
38 //}
39
40 ajaxInfo.url = top.apiUrl + ajaxInfo.url.replace(/{TenantId}/g, top.tenantId);
41
42 }
43
44 //处理 beforeSend
45 var beforeSend = ajaxInfo.beforeSend;
46
47 ajaxInfo.beforeSend = function (XMLHttpRequest) {
48 if (typeof beforeSend == "function")
49 beforeSend(token);
50
51 XMLHttpRequest.setRequestHeader("Authorization", "Bearer " + top.token);
52 }
53
54 //处理xhrFields
55 if (typeof ajaxInfo.xhrFields == "undefined") {
56 ajaxInfo.xhrFields = {
57 //允许cors跨域访问时添加cookie
58 withCredentials: true
59 };
60 } else {
61 if (typeof ajaxInfo.xhrFields.withCredentials == "undefined") {
62 ajaxInfo.xhrFields.withCredentials = true;
63 }
64 }
65 //使用cors的方式实现跨域
66 jQuery.support.cors = true;
67
68 //处理error
69 var error = ajaxInfo.error;
70 ajaxInfo.error = function(request, textStatus, errorThrown) {
71 //访问失败,自动停止加载动画,并且给出提示
72 //获取返回的错误提示
73
74 var errMsg = request.responseText;
75 if (typeof errMsg != "undefined") {
76 errMsg = eval("(" + errMsg + ")");
77 errMsg = errMsg.message;
78 }
79 alert("提交" + ajaxInfo.title + "的时候发生错误!\r\n<br>" + errMsg);
80 if (typeof top.spinStop == "function")
81 top.spinStop();
82 if (typeof error == "function") error();
83 };
84
85 //处理success
86 var success = ajaxInfo.success;
87 ajaxInfo.success = function(data) {
88 //显示调试信息
89 //if (typeof parent.DebugSet != "undefined")
90 // parent.DebugSet(data.debug);
91
92 if (typeof success == "function")
93 success(data);
94
95 };
96
97 //开始执行ajax
98 $.ajax(ajaxInfo);
99
100
101 };
 1 //查询数据
2 Nature.Ajax.find = function (ajaxInfo) {
3 ajaxInfo.type = "GET";
4 var info = ajaxInfo.pagerInfo ;
5 //处理url,分页和查询
6 if (typeof info != "undefined") {
7 if (typeof ajaxInfo.data == "undefined") ajaxInfo.data = {};
8
9 if (typeof info.pageSize != "undefined")
10 ajaxInfo.data["$top"] = info.pageSize;
11
12 if (typeof info.pageIndex != "undefined")
13 ajaxInfo.data["$skip"] = (info.pageIndex - 1) * info.pageSize;
14
15 if (typeof info.orderby != "undefined" && info.orderby != "")
16 ajaxInfo.data["$orderby"] = info.orderby;
17
18 }
19
20 //处理查询条件
21
22
23
24 //处理返回事件 $orderby
25 var success = ajaxInfo.success;
26
27 ajaxInfo.success = function (data) {
28 //
29 //判断返回信息
30 if (typeof data.message != "undefined") {
31 alert(data.message);
32 } else {
33 if (typeof success == "function")
34 success(data);
35 }
36 };
37
38 Nature.Ajax(ajaxInfo);
39
40 };
//添加数据
Nature.Ajax.add = function(ajaxInfo) {
ajaxInfo.type = "POST"; //判断data 。添加 id 和tenantId。
if(typeof ajaxInfo.data != "undefined"){
if(typeof ajaxInfo.data.id != "undefined"){
ajaxInfo.data.id = '00000000000000000000000000000000';
}
if(typeof ajaxInfo.data.tenantId != "undefined"){
ajaxInfo.data.tenantId = top.tenantId;
}
} Nature.Ajax(ajaxInfo); }; //修改数据
Nature.Ajax.update = function(ajaxInfo) {
ajaxInfo.type = "PUT";
//判断data 。添加 tenantId。
if(typeof ajaxInfo.data != "undefined"){ if(typeof ajaxInfo.data.tenantId != "undefined"){
ajaxInfo.data.tenantId = top.tenantId;
}
} Nature.Ajax(ajaxInfo); }; //删除数据
Nature.Ajax.del = function(ajaxInfo) {
ajaxInfo.type = "DELETE"; Nature.Ajax(ajaxInfo); };

jQuery的ajax对WebApi和OData的封装的更多相关文章

  1. 基于jQuery的ajax对WebApi和OData的封装

    基于jQuery的ajax对WebApi和OData的封装 WebApi 的使用带来了一个显著的特点,对type有一定的要求.一般ajax的type无非就是两种,GET和POST.如果用JSONP来跨 ...

  2. MVC下通过jquery的ajax调用webapi

    如题 jquery的应用,不会的自己去补. 创建一个mvc项目,新建控制器.视图如下: 其中data控制器负责向前台提供数据,home控制器是一个简单的访问页控制器. data控制器代码如下: pub ...

  3. jquery通过ajax获取数据(优化、封装)

    下载页面查看: makeGrid.js   ,column.js  ,XiangMuGuanLi.aspx <div class="tb_container" id=&quo ...

  4. jquery通过ajax获取数据,控制显示的数据条数

    效果图: 现在我们可以先看它的json数据,如图所示:                然后可以对应我们的代码进行理解. jquery通过ajax获取数据,并通过窗口大小控制显示的数据条数,以及可以根据 ...

  5. Jquery和Ajax的关系!

    Jquery是一种JavaScript框架,而Ajax(Asynchronous JavaScript and XML)是异步JavaScript和XML. Jquery是JavaScript的框架, ...

  6. ASP.NET 跨域请求之jQuery的ajax jsonp的使用解惑 (转载)

    前天在项目中写的一个ajax jsonp的使用,出现了问题:可以成功获得请求结果,但没有执行success方法,直接执行了error方法提示错误——ajax jsonp之前并没有用过,对其的理解为跟普 ...

  7. jQuery之ajax实现篇

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...

  8. 【原创经验分享】JQuery(Ajax)调用WCF服务

    最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...

  9. jQuery版AJAX简易封装

    开发过程中,AJAX的应用应该说非常频繁,当然,jQuery的AJAX函数已经非常好用,但是小编还是稍微整理下,方便不同需求下,可以简化输入参数,下面是实例代码: $(function(){ /** ...

随机推荐

  1. 调整CentOS的文字登陆界面的分辨率

    通过文字界面登陆到系统,切换到root权限. 用vi打开  /boot/grub/menu.lst 文件  ,因为menu.lst是grub.conf文件的快捷方式,终于打开的还是grub.conf文 ...

  2. SPPS java 创template

    最近写信给学校一个部门java plug for spss. 当加到变量超过70个月,然后保存,SPSS它会在错误的地方报. 解决方案: 每添加70提交变量. 版权声明:本文博主原创文章.博客,未经同 ...

  3. (初稿)SQL Server 复制(Replication)系列(2)——事务复制搭建

    原文:(初稿)SQL Server 复制(Replication)系列(2)--事务复制搭建 本文演示如何搭建最基本的事务复制. 环境准备: 虚拟机2台: 服务器名分别为RepA和RepB,RepA为 ...

  4. JTextAreaDemo

    问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成 ...

  5. Cocos2d-X中实现批处理精灵

    使用普通方法实现批处理精灵 在Sprite.h中加入以下的代码 #ifndef __Sprite_SCENE_H__ #define __Sprite_SCENE_H__ #include " ...

  6. cocos2dX 音乐和声音效果

    今天, 我们学习cocos2dX里面音乐和音效, 为什么学他呢, 难道你喜欢看无声电影( 旁白: 我就喜欢关着声音玩), 我们不要管旁白了, 她是个疯子 老规矩, 资源准备好: 一首<故宫神思& ...

  7. Spring配置与第一Spring HelloWorld

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 本文将主讲了Spring在Eclipse下的配置,并用Spring执行了第一个HelloWo ...

  8. Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)

    上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧.额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥! 重力版链接:http://b ...

  9. hdu 3911 Black And White(线段树)

    题目连接:hdu 3911 Black And White 题目大意:给定一个序列,然后有M次操作: 0 l r:表示询问l,r中最大连续1的个数 1 l r:表示将l,r区间上的数取反 解题思路:线 ...

  10. MEF实现设计上的“松耦合”

    C#进阶系列——MEF实现设计上的“松耦合”(二)   前言:前篇 C#进阶系列——MEF实现设计上的“松耦合”(一) 介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能 ...