1. 什么是OData?

  OData 全称 Open Data Protocol,字面理解为开放数据协议,是一个基于Http协议且API实现为Restful风格的协议标准,目前由微软支持大力推广,你可以看到MS自家产品,如WebApi、WCF均开始支持,可谓前景一片光明,其官网为:http://www.odata.org

2. 用它来做什么?

  说的通俗点,大家在开发B/S应用时,前后台交互,大多采用 Ajax + json,而且大量操作是针对业务实体的增删改查和分页,但是大家对于Ajax请求的Url地址以及请求和应答的Json格式定义可谓千差万别,这时候OData站出来了,说:”你们特么都别瞎搞了,我定义一套统一的标准,大家都按我的搞吧“,于是前后台交互的数据规范产生了,为什么要统一?规范统一之后各种基于这个标准的类库、工具就会层出不穷,这不,官网列了很多基于此标准的工具((http://www.odata.org/libraries),既然是通信协议,就会包括服务端和客户端,我们后面要讲的AspNet.OData就是服务端的一种实现,不久以后大家的增删改查也许嗖嗖几行代码就解决了,鼓掌吧~~~~~

3. 协议基础介绍

  OData协议目前最新版本为V4,本教程以V4为例进行介绍,官方已经实现了一个开源的服务端,名为TripPin,具体介绍可以参考:http://www.odata.org/blog/trippin-new-odata-v4-sample-service,该服务的访问地址为:http://services.odata.org/V4/TripPinServiceRW,下面的协议介绍大家可以通过访问对应的链接(使用服务地址替换下方的serviceRoot)进行对比学习,本文仅介绍典型特性,参考了官方基础教程(basic-tutorial) 协议细节请查看官方文档 OData Documentation

3.1 请求实体

请求实体集合

此请求返回 People 实体的集合(默认是前8个)

GET serviceRoot/People 

替换之后实际的url是 http://services.odata.org/V4/TripPinServiceRW/People ,访问之后返回了json格式的People实体集合

 {
     "@odata.context": "serviceRoot/$metadata#People",
     "@odata.nextLink": "serviceRoot/People?%24skiptoken=8",
     "value": [
         {
             "@odata.id": "serviceRoot/People('russellwhyte')",
             "@odata.etag": "W/\"08D1694BD49A0F11\"",
             "@odata.editLink": "serviceRoot/People('russellwhyte')",
             "UserName": "russellwhyte",
             "FirstName": "Russell",
             "LastName": "Whyte",
             "Emails": [
                 "Russell@example.com",
                 "Russell@contoso.com"
             ],
             "AddressInfo": [
                 {
                     "Address": "187 Suffolk Ln.",
                     "City": {
                         "CountryRegion": "United States",
                         "Name": "Boise",
                         "Region": "ID"
                     }
                 }
             ],
             "Gender": "Male",
             "Concurrency": 635404796846280400
         },
         ......
         ,
         {
             "@odata.id": "serviceRoot/People('keithpinckney')",
             "@odata.etag": "W/\"08D1694BD49A0F11\"",
             "@odata.editLink": "serviceRoot/People('keithpinckney')",
             "UserName": "keithpinckney",
             "FirstName": "Keith",
             "LastName": "Pinckney",
             "Emails": [
                 "Keith@example.com",
                 "Keith@contoso.com"
             ],
             "AddressInfo": [],
             "Gender": "Male",
             "Concurrency": 635404796846280400
         }
     ]
 }

其中带@字符的属性都是一些便捷查询与数据本身无关,比如上面的 @odata.context、@odata.nextLink、@odata.id、@odata.etag、@odata.editLink,有一些后面再介绍。这里介绍一下 @odata.context和@odata.nextLink,@odata.context是数据服务的元数据查询请求,类似于webservice的wsdl,可以使用 OData Client for .NET 生成客户端代码,进而进行调用,类似与Webservice的使用。而 @odata.nextLink 是下一页的意思,默认/People查询只会返回8个实体,使用skiptoken=8,可以跳过前8个实体,这样就达到了分页的目的。

通过主键请求单个实体

因为People实体的主键是UserName,所以此请求会返回一个UserName为russellwhyte的实体。

GET serviceRoot/People('russellwhyte')

应答结果为:

 {
     "@odata.context": "serviceRoot/$metadata#People/$entity",
     "@odata.id": "serviceRoot/People('russellwhyte')",
     "@odata.etag": "W/\"08D1694BF26D2BC9\"",
     "@odata.editLink": "serviceRoot/People('russellwhyte')",
     "UserName": "russellwhyte",
     "FirstName": "Russell",
     "LastName": "Whyte",
     "Emails": [
         "Russell@example.com",
         "Russell@contoso.com"
     ],
     "AddressInfo": [
         {
             "Address": "187 Suffolk Ln.",
             "City": {
                 "CountryRegion": "United States",
                 "Name": "Boise",
                 "Region": "ID"
             }
         }
     ],
     "Gender": "Male",
     "Concurrency": 635404797346655200
 }

请求单个属性

在单实体查询url的后面加上属性名称可以进行指定属性的查询,如果实体属性是复杂对象,可以使用类似的方式继续查询其内部属性。

先看一下Airport实体的结构,使用 GET serviceRoot/Airport,然后用F12看下返回值

可以确定主键是IcaoCode属性,而且Location属性是复杂对象,下面看一下属性查询的格式

简单属性查询

GET serviceRoot/Airports('KSFO')/Name 

应答结果:

{
    "@odata.context": "serviceRoot/$metadata#Airports('KSFO')/Name",
    "value": "San Francisco International Airport"
}

复杂属性查询

GET serviceRoot/Airports('KSFO')/Location/Address

应答结果:

{
"@odata.context": "serviceRoot/$metadata#Airports('KSFO')/Location/Address",
"value": "South McDonnell Road, San Francisco, CA 94128"
}

查询属性原始值

通过在属性查询url中增加$value,直接查询属性原始值,如:

GET serviceRoot/Airports('KSFO')/Name/$value

应当结果为:

San Francisco International Airport

其他查询请求

还有一些其他请求,本来打算一并介绍,后来觉得原文已经介绍的很好了,而且英文很简单,所以在此只抛砖引玉,不再赘述。

  • 查询请求,通过协议中规定的一套查询表达式,可以任意的构造类似SQL语句的查询请求,这个结合服务端实现,会让后端代码骤减。

    • 根据FirstName获取People GET serviceRoot/People?$filter=FirstName eq 'Scott'
    • 复杂属性Location的Address属性包含“San Francisco”  GET serviceRoot/Airports?$filter=contains(Location/Address, 'San Francisco')
    • 查询枚举属性  获取所有男性 GET serviceRoot/People?$filter=Gender eq Microsoft.OData.SampleService.Models.TripPin.PersonGender'Female'
    • 查询排序  GET serviceRoot/People('scottketchum')/Trips?$orderby=EndsAt desc
    • 分页查询 GET serviceRoot/People?$top=2 GET serviceRoot/People?$skip=18
    • 计数查询 GET serviceRoot/People/$count
    • 导航属性 GET serviceRoot/People('keithpinckney')?$expand=Friends
    • 选择检索 GET serviceRoot/Airports?$select=Name, IcaoCode
    • lambsa GET serviceRoot/People?$filter=Emails/any(s:endswith(s, 'contoso.com'))
  • 数据修改请求,实现实体的增删改查。

AspNet.OData 协议概述的更多相关文章

  1. WCF Data Service 使用小结 (一)—— 了解OData协议

    最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不多,但它确实是个很好的 ...

  2. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  3. 使用 node-odata 轻松创建基于 OData 协议的 RESTful API

    前言 OData, 相信身为.NET程序员应该不为陌生, 对于他的实现, 之前也有童鞋进行过介绍(见:这里1,这里2). 微软的WCF Data Service即采用的该协议来进行通信, ASP.NE ...

  4. javaweb学习总结十九(http协议概述以及http请求信息分析)

    一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...

  5. 嵌入式linux的网络编程(1)--TCP/IP协议概述

    嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...

  6. 【HTTP 2】HTTP/2 协议概述(HTTP/2 Protocol Overview)

    前情提要 在上一篇文章<[HTTP 2.0] 简介(Introduction)>中,我们简单介绍了 HTTP 2. 在本篇文章中,我们将会了解到 HTTP 2 协议概述部分的内容. HTT ...

  7. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  8. 【高速接口-RapidIO】1、RapidIO协议概述

    一.RapidIO背景介绍 RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能. 低引脚数. 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放 ...

  9. 1.RapidIO协议概述

    转自https://www.cnblogs.com/liujinggang/p/9925859.html 一.RapidIO背景介绍 RapidIO是由Motorola和Mercury等公司率先倡导的 ...

随机推荐

  1. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

  2. CentOS 7安装配置FTP服务器

    CentOS 7下FTP服务器的安装配置. 假设我们有以下要求 路径 权限 备注 /ftp/open 公司所有人员包括来宾均可以访问 只读 /ftp/private 仅允许Alice.Jack.Tom ...

  3. ajax三级联动下拉菜单

    ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可: 来找一张表: 实现: 中国地域的三级联动:省.市.区: 图: 说一下思路: (1)当用户选择省份的时候触发事件,把当前的省份的id通过 ...

  4. 使用IDEA的gradle整合spring+springmvc+mybatis 采用javaconfig配置

    1.在上篇博客里讲述了spring+mybatis的整合,这边在上篇的基础上进行开发. 上篇博客链接http://www.cnblogs.com/huangyichun/p/6149946.html ...

  5. CDbConnection failed to open the DB connection

    打开数据库失败 有我遇到的有寄给问题: 1 Not find Drive 2 SQLSTATE[28000] [1045] Access denied for user 'xxx'@'localhos ...

  6. 配置adb环境变量

    作为Android开发人员,会经常使用adb命令来进行push.pull.install.看数据库等.记录一下adb配置流程,以备后用. 在没有配置adb之前,我们打开Windows命令处理程序(cm ...

  7. android-自定义广告轮播Banner(无限循环实现)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  8. JavaScript tips:数组去重

    1.实现目标:数组去重 2.实现思路: (1)创建新数组. (2)遍历原数组,判断当前被遍历元素是否存在于新数组,如果存在于新数组,则判断当前被遍历元素是重复的:如果不存在于新数组,则判断当前被遍历元 ...

  9. javascript继承---组合式继承

    原型链继承和构造函数继承中存在着很多的缺陷,所以,使用组合式继承了进行弥补这些缺陷 //组合继承 //父函数 function a(){ this.name = "兔子只吃胡萝卜" ...

  10. 输入输出流类iostream常用函数解析

    原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5657192.html 一.成员类型 1. ios::fmtflags: 格式标志,常用来设置输出的 ...