• AspNet.OData 协议概述


    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实体集合

     1 {
     2     "@odata.context": "serviceRoot/$metadata#People",
     3     "@odata.nextLink": "serviceRoot/People?%24skiptoken=8",
     4     "value": [
     5         {
     6             "@odata.id": "serviceRoot/People('russellwhyte')",
     7             "@odata.etag": "W/"08D1694BD49A0F11"",
     8             "@odata.editLink": "serviceRoot/People('russellwhyte')",
     9             "UserName": "russellwhyte",
    10             "FirstName": "Russell",
    11             "LastName": "Whyte",
    12             "Emails": [
    13                 "Russell@example.com",
    14                 "Russell@contoso.com"
    15             ],
    16             "AddressInfo": [
    17                 {
    18                     "Address": "187 Suffolk Ln.",
    19                     "City": {
    20                         "CountryRegion": "United States",
    21                         "Name": "Boise",
    22                         "Region": "ID"
    23                     }
    24                 }
    25             ],
    26             "Gender": "Male",
    27             "Concurrency": 635404796846280400
    28         },
    29         ......
    30         ,
    31         {
    32             "@odata.id": "serviceRoot/People('keithpinckney')",
    33             "@odata.etag": "W/"08D1694BD49A0F11"",
    34             "@odata.editLink": "serviceRoot/People('keithpinckney')",
    35             "UserName": "keithpinckney",
    36             "FirstName": "Keith",
    37             "LastName": "Pinckney",
    38             "Emails": [
    39                 "Keith@example.com",
    40                 "Keith@contoso.com"
    41             ],
    42             "AddressInfo": [],
    43             "Gender": "Male",
    44             "Concurrency": 635404796846280400
    45         }
    46     ]
    47 }

    其中带@字符的属性都是一些便捷查询与数据本身无关,比如上面的 @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')

    应答结果为:

     1 {
     2     "@odata.context": "serviceRoot/$metadata#People/$entity",
     3     "@odata.id": "serviceRoot/People('russellwhyte')",
     4     "@odata.etag": "W/"08D1694BF26D2BC9"",
     5     "@odata.editLink": "serviceRoot/People('russellwhyte')",
     6     "UserName": "russellwhyte",
     7     "FirstName": "Russell",
     8     "LastName": "Whyte",
     9     "Emails": [
    10         "Russell@example.com",
    11         "Russell@contoso.com"
    12     ],
    13     "AddressInfo": [
    14         {
    15             "Address": "187 Suffolk Ln.",
    16             "City": {
    17                 "CountryRegion": "United States",
    18                 "Name": "Boise",
    19                 "Region": "ID"
    20             }
    21         }
    22     ],
    23     "Gender": "Male",
    24     "Concurrency": 635404797346655200
    25 }

    请求单个属性

    在单实体查询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'))
    • 数据修改请求,实现实体的增删改查。
  • 相关阅读:
    Docker 日志都在哪里?怎么收集?
    docker link 过时不再用了?那容器互联、服务发现怎么办?
    Centos7.0 配置docker 镜像加速
    使用docker搭建公司redmine服务器
    Jenkins pipeline:pipeline 使用之语法详解
    Xcode脚本自动化打包问题:xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
    java基础(7)---IO流
    java基础(6)---面向对象,类,包
    java基础(5)---内存分配
    java基础(4)---引用数据类型(数组、字符串、集合)
  • 原文地址:https://www.cnblogs.com/MinnieChang/p/4002718.html
Copyright © 2020-2023  润新知