Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3596229
  • 博文数量: 1575
  • 博客积分: 19423
  • 博客等级: 上将
  • 技术积分: 16102
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 21:36
个人简介

专注专心

文章分类

全部博文(1575)

文章存档

2020年(10)

2018年(7)

2016年(6)

2015年(21)

2014年(32)

2013年(279)

2012年(516)

2011年(309)

2010年(260)

2009年(92)

2008年(15)

2007年(28)

我的朋友

分类: IT职场

2014-09-24 10:31:54


程序数据库格式标准化的开源数据协议
为了增强各种网页应用程序之间的数据兼容性,微软公司启动了一项旨在推广网页程序数据库格式标准化的开源数据协议(OData)计划,于此同时,他们还发 布了一款适用于OData协议的开发工具,以方便网页程序开发者们使用。
Open Data Protocol (开放数据协议,OData)是用来查询和更新数据的一种Web协议,其提供了把存在于应用程序中的数据暴露出来的方式。OData运用且构建于很多 Web技术之上,比如HTTP、Atom Publishing Protocol(AtomPub)和JSON,提供了从各种应用程序、服务和存储库中访问信息的能力。OData被用来从各种数据源中暴露和访问信息, 这些数据源包括但不限于:关系数据库、文件系统、内容管理系统和传统Web站点。

odata是一个协议,定义的是程序数据库格式标准化的开源数据协议。该协议定义了可以操作的资源和方法,以及可以对这些资源执行的操作(GET、PUT、POST、MERGE 和 DELETE,分别对应着读取、创建、替换、合并和删除)。本文主要倾向于如何用JAVA实现ODATA协议,强调一点,只是一个实现的思路,具体的实现可以去参考odata4j。
     要实现odata,首先要知道odata定义的内容是什么,简单的说,odata定义的是一个使用URL访问数据库数据的方法,这个url包括如何传参,如何传递操作方式等等。
     因此,在使用java实现odata的时候,应该首先定义一个接口,这个接口能够获取这个URL,然后定义一个解析器,这个解析器负责根据odata的协议解析这个URL,将访问的数据已经执行的操作传递给执行器,由执行器负责按照执行的要求执行操作,操作完成之后,将结果返回给请求端。
     由此可以找到,要实现odata协议,需要定义的包括:
1.URL接收类
2.URL解析类
3.操作执行类
     需要说明的是,对于不同的语言,odata实现的方式是不同的,即使是相同的语言,数据结构不同,实现的方式也不一样,因此要注意,并不是一种语言可以实现一个完全通用的odata类库,每一个系统都可能有不同的odata实现,应该是根据该系统的数据库结构来实现的。



前言

  OData 这词也算是目前热门的词汇之一,而在 .NET Web API 中也支持了 OData 查询服务,本篇就来看看如何在 Web API 中加入 OData 来进行操作。

OData 为何?

  OData 全名 Open Data Protocol (开放数据协议),是由微软所提出的协议,主要目的在于透过 HTTP 服务提供 CRUD 的存取服务,最早出现于 WCF Data Service 中,当 Web API 推出时也提供支持 OData 协议,OData 协议建构在 RESTful 服务上,透过公开的 URI 位置进行操作,例如以下的一个 URI 位置范例:

 
  上面网址中 $top 就是 OData 协议中的一个指令,可以发现使用 OData 的操作方式就是在原本的 URI 位置后附加相对应要操作的指令,以下列出常用的 OData 指令:

$top:同 T-SQL 的 TOP,指定取得数据的前几笔。
$orderby:同 T-SQL 的 ORDER BY,可指定想排序的字段。
$skip:略过的笔数,可用于数据分页查询。
$filter:过滤条件,额外区分 eg (等于)、ne (不等于) 、lt (小于)、le (小于等于)、gt (大于)、ge (大于等于)。
 

  上方列出的是常用的指令,当然,因为 OData 还在继续发展中,所以日后可能将提供更多的指令可以使用,在使用 OData 指令时需要注意指令都需要包含「$」符号,且当如果有多个指令需要串接时,可以使用「&」符号进行串接,例如: /api/products?$top=1&$orderby=Id 。

  在 Web API 中透过了使用 OData 的帮助,能够让开发者在开发时期专心于数据处理与逻辑的撰写,能先不考虑因使用者的需求而需要进行某些排序、筛选的问题,开发人员也不必因特定需求而要多撰写对应方法,只需要最后透过 OData 指令就能够很有弹性的筛选出目标数据。

实作 OData

  首先提醒一点,如果要在 .Net Framework 4.0 上使用 OData,需要额外安装 OData 扩充组件,我们可以透过使用 NuGet 来安装 OData 组件,如下:

 .
 

  接下来使用前几篇所建立的范例程序代码,先来看一段程序代码,以下是未使用 OData 的取得产品数据方法:

 

1.public IEnumerable GetAllProducts()
2.{
3.IEnumerable products = new ProductDao().GetProducts();
4.if (products.FirstOrDefault() != null)
5.return products;
6.else
7.throw new HttpResponseException(HttpStatusCode.NotFound);
8.}

  接着如果我们要让这个取得产品数据的方法变成能够支持 OData 时该如何处理呢? 我们只要稍微改变一下它,看到此方法回传的型别为 IEnumerable 型别,在使用 OData 时需要将 IEnumerable 型别置换成 IQueryable 型别,为何要使用 IQueryable 而不使用 IEnumerable ?

 

  IQueryable 与 IEnumerable 都是在去执行例如 Count() 方法实际产生列取时才会开始产生 SQL 语法捞取数据,但其实两者执行时是有差异的,IEnumerable 在建立其列举时其 SQL 语法就已经固定不变了,如后续再针对此 IEnumerable 附加额外的查询条件时 SQL 语法也不会变更,附加的查询则是将数据捞取出来后才在内存内再做塞选,而 IQueryable 呢? 参考 MSDN 文件中可以发现 IQueryable 多了一个 IQueryProvider 接口,IQueryProvider 能够保存列举前额外增加的查询条件并变动最终执行的 SQL 语法,如对于实际要去数据库捞取数据时差异就会显现,如 LINQ to SQL、Entity Framework,详情可参考黑大的 关于IQueryable特性的小实验 文章。

 

  修改回传 IEnumerable 型别改成 IQueryable 型别后还需要记得在 GetProducts() 方法时加入 AsQueryable 进行转换,最后在方法加上 [Queryable] 属性,如下:

 

01.[Queryable]
02.public IQueryable GetAllProducts()
03.{
04.IQueryable products =
05.new ProductDao().GetProducts().AsQueryable();
06.if (products.FirstOrDefault() != null)
07.return products;
08.else
09.throw new HttpResponseException(HttpStatusCode.NotFound);
10.}

  以上修改完成后,我们就能开始测试看看使用 OData 的效果,如下:

 取得第一笔资料

.
 
使用 Price 排序
 
.
 
略过第 1 笔并使用 Price 排序
 
.
 
 查询分类为 MVC 且 ID 为 1
.

  如此就完成使用 OData 协议的查询功能了,另外如果需要针对 JSON 返回的数据把一些字段隐藏起来的话,可以加入 System.Runtime.Serialization 组件参考,加入后在 Entity Class 的公开属性上加入 [IgnoreDataMember] 属性,如下:

01.public class Product
02.{
03.public int Id { get; set; }
04.public string Name { get; set; }
05.public string Category { get; set; }
06.public string Price { get; set; }
07.[IgnoreDataMember]
08.public int Stock { get; set; }
09.}

  这样回传的 JSON 数据就看不到该字段了,如下:

 .
 

阅读(3484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~