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. 算法模板——Dinic最小费用最大流

    实现功能:输入M,N,S,T:接下来M行输入M条弧的信息(包括起点,终点,流量,单位费用):实现功能是求出以S为源点,T为汇点的网络最大流的最小费用 其实相当的像Dinic最大流呐= = 还是spfa ...

  2. Protobuf 在Ubuntu 14上的编译与使用

    前言 一直知道Google开源的一个与语言无关的数据交换协议:protobuf.只知道是一种不同于json和XML的格式,还有就是性能特别的好(这在Java和C++的实现确实是!) 最近闲下来看了下G ...

  3. JAVA-Servlet-ServletConfig 与 ServletContext 的区别

    什么是ServletConfig? Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象.在servletConfig对象中包含了serv ...

  4. windows32位安装MYSQL-python1.2.3

    建议不要用pip安装MYSQL-python,因为会自动选择MYSQL-python1.2.5这个版本,但是这个版本不支持windows 32位系统. 1.首先安装VS2008,因为要依赖VC9.0编 ...

  5. 深入理解CPU和异构计算芯片GPU/FPGA/ASIC (上篇)

    王玉伟,腾讯TEG架构平台部平台开发中心基础研发组资深工程师,专注于为数据中心提供高效的异构加速云解决方案.目前,FPGA已在腾讯海量图片处理以及检测领域已规模上线. 随着互联网用户的快速增长,数据体 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log

    日常啰嗦 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书<Docker技术入门与实战>(第二版) ...

  7. unity插件开发——AssetDatabase

    AssetDatebase也是一个静态类,他的作用是管理整个工程的所有文件(一般成为“资产”).直观地说就是管理整个project窗口中的所有内容,比如,你可以增加.删除.修改文件等等. 这里有几个常 ...

  8. 怎样获得PRINCE2证书?报名PRINCE2有什么条件?

    参加培训:想要获得PRINCE2资格证书,参加培训是非常必要的,正规的培训机构有获得组织认证考试的权力.光环国际全年开设prince2课程班,全国各个地区均可以选择培训及考试 选择培训机构:只有经AP ...

  9. C#研究OpenXML之路(4-使用第三方库)

    一.悲催的OpenXML操作 学习并使用了一段时间的OpenXML,感觉用这个来操作Excel文件真是一件非常悲催的事情,由于我自己比较熟悉Excel COM的操作,但到了OpenXML中发现,之前所 ...

  10. 准备要开始写博客啦~Hello World

    Hello World 新的开始 加油咯 小蚊子~