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. React之ref详细用法

    在react典型的数据流中,props传递是父子组件交互的唯一方式:通过传递一个新的props值来使子组件重新re-render,从而达到父子组件通信.当然,就像react官网所描述的一样,在reac ...

  2. 从零开始学JavaWeb

    引言   记得上学时,有位导师说过一句很经典的话:"编程语言只是工具,最重要的是掌握思想." 笔者一直主要从事.net领域的开发工作.随着工作阅历的丰富,越来越深刻的理解当年导师说 ...

  3. 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列

    3377: [Usaco2004 Open]The Cow Lineup 奶牛序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 16  Solved ...

  4. win7下Apache2.4安装、配置及服务自启动

    为了测试微信平台接口,在电脑上安装的Apache服务器,把安装步骤记下来以后备用 第一篇文章,不好请见谅 Apache2.4.17下载地址:http://www.apachelounge.com/do ...

  5. 关于EasyUI 1.5版Datagrid组件在空数据时无法显示"空记录"提示的BUG解决方法

    问题:jQuery easyUI中Datagrid,在表格数据加载无数据的时候,如何显示"无记录"的提示语? 解决jQuery EasyUI 1.5.1版本的Datagrid,在处 ...

  6. 用js写倒计时,向列表添加数据-------2017-03-21

    一.单选按钮确定提交是否可用 <input id="a" type="radio" name="a"  onclick="c ...

  7. Linux环境Perl链接MS Sql Server数据库

    1.下载相关软件 unixODBC.freetds和DBD-ODBC ①.Linux系统的ODBC unixODBC-2.3.4.tar.gz ( http://www.unixodbc.org) ② ...

  8. 【VB超简单入门】五、基本输出输入

    之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...

  9. python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答

    首先先给出总结:input () = int(raw_input()) 有图有真相!!! 先看看input的例子: 可见用input键入得到int类型的数据,那如果输入一些非int类型的会怎么样呢? ...

  10. httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接

    PoolingHttpClientConnectionManager是一个HttpClientConnection的连接池,可以为多线程提供并发请求服务.主要作用就是分配连接,回收连接等.同一个rou ...