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. Effective Modern C++ Item 27:重载universal references

    假设有一个接收universal references的模板函数foo,定义如下: template<typename T> void foo(T&& t) { cout ...

  2. 2017-3-18 SQL server 数据库 45道题

    use data02161212 create table student (Sno nvarchar(3) primary key, Sname nvarchar(8) not null, Ssex ...

  3. 说说API的防重放机制

    说说API的防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果 ...

  4. spring boot gradle build:bootRepackage failed

    When running 'gradle clean build' on my spring boot project (version 1.3.6.RELEASE) on windows 10 (a ...

  5. 对于用div+css随心所欲布局的思考

    在div+css取代Table成为主流的时代,学会用其进行随心所欲的布局是一个不可回避的技能.那么,重点掌握哪几个要点呢? 整体布局:从整体到局部的顺序进行布局,逐步定义div集css样式: 灵活运用 ...

  6. keepalive配置文件详解

    第一部分:全局定义块 1.email通知.作用:有故障,发邮件报警. 2.Lvs负载均衡器标识(lvs_id).在一个网络内,它应该是唯一的. 3.花括号“{}”.用来分隔定义块,因此必须成对出现.如 ...

  7. 在亚马逊Red Hat 7.1 linux上安装mysql

      安装前检查之前是否安装并卸载之前的和删除关联文件 rpm -qa|grep mysql     yum remove mysql mysql-server mysql-libs mysql-com ...

  8. cephfs创建及挂载

    Ceph 文件系统( Ceph FS )是个 POSIX 兼容的文件系统,它使用 Ceph 存储集群来存储数据.Ceph 文件系统要求 Ceph 存储集群内至少有一个 Ceph 元数据服务器. 1.添 ...

  9. 反射实现 Data To Model

    调用 : public ActionResult Index() { DataTable dt = new DataTable(); dt.Columns.Add("Name"); ...

  10. Itext中 根据html生成Word文件,包含图片

    package cn.com.wzf; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.Str ...