zoukankan      html  css  js  c++  java
  • 创建WebApi Odata v3 终结点

    开放数据协议(OData) 是用于 web 的数据访问协议。 OData 提供统一的方法来构造数据、 查询的数据和操作该数据集通过 CRUD 操作 (创建、 读取、 更新和删除)。 OData 支持 AtomPub (XML) 和 JSON 格式。 OData 还定义了一种方法来公开数据的元数据。 客户端可以使用元数据发现的类型信息和数据集的关系。

    ODataConventionModelBuilder创建 EDM 使用一组默认命名约定 EDM。 此方法要求最少的代码。 如果你想更好地控制 EDM,则可以使用ODataModelBuilder类,以通过添加属性、 键和导航属性显式创建 EDM。

    请求

    GET http://localhost:61068/odata HTTP/1.1
    User-Agent: Fiddler
    Host: localhost:61068
    Accept: application/json
    

    返回

    {
      "odata.metadata":"http://localhost:61068/odata/$metadata","value":[
        {
          "name":"Products","url":"Products"
        }
      ]
    }
    

    探索 OData 终结点

    服务元数据文档

    服务元数据文档介绍了使用一种称为概念架构定义语言 (CSDL) 的 XML 语言的服务数据模型。 元数据文档在服务中,显示的数据结构,并可用于生成客户端代码。

    若要获取的元数据文档,请将发送 GET 请求到http://localhost:port/odata/$metadata

    请求元数据
    http://localhost:61068/odata/$metadata

    结果

    <?xml version="1.0" encoding="utf-8"?>
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
      <edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
        <Schema Namespace="ProjectServer.Models" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
          <EntityType Name="Product">
            <Key>
              <PropertyRef Name="ID" />
            </Key>
            <Property Name="ID" Type="Edm.Int32" Nullable="false" />
            <Property Name="Name" Type="Edm.String" />
            <Property Name="Price" Type="Edm.Decimal" Nullable="false" />
            <Property Name="Category" Type="Edm.String" />
          </EntityType>
        </Schema>
        <Schema Namespace="Default" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
          <EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
            <EntitySet Name="Products" EntityType="ProjectServer.Models.Product" />
          </EntityContainer>
        </Schema>
      </edmx:DataServices>
    </edmx:Edmx>
    

    实体集

    若要获取的产品实体集,将发送 GET 请求到http://localhost:port/odata/Products

    {
      "odata.metadata":"http://localhost:61068/odata/$metadata#Products","value":[
        {
          "ID":1,"Name":"Hat","Price":"15.00","Category":"Apparel"
        },{
          "ID":2,"Name":"Socks","Price":"5.00","Category":"Apparel"
        },{
          "ID":3,"Name":"Scarf","Price":"12.00","Category":"Apparel"
        },{
          "ID":4,"Name":"Yo-yo","Price":"4.95","Category":"Toys"
        },{
          "ID":5,"Name":"Puzzle","Price":"8.00","Category":"Toys"
        }
      ]
    }
    

    实体

    若要获取的各个产品,发送 GET 请求到http://localhost:port/odata/Products(1),其中"1"是产品 id。

    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: application/json; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    DataServiceVersion: 3.0
    Date: Mon, 23 Sep 2013 23:04:29 GMT
    Content-Length: 140
    
    {
      "odata.metadata":"http://localhost:60868/odata/$metadata#Products/@Element","ID":1,
          "Name":"Hat","Price":"15.00","Category":"Apparel"
    }
    

    OData 序列化格式

    • Atom Pub (XML)
    • JSON "light" (introduced in OData v3)
    • JSON "verbose" (OData v2)

    默认情况下,Web API 使用 AtomPubJSON"light"格式。
    若要获取 AtomPub 格式,请设置为"application/atom + xml"Accept 标头。 下面是响应正文示例:

    Accept: application/atom+xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <entry xml:base="http://localhost:61068/odata" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
      <id>http://localhost:61068/odata/Products(1)</id>
      <category term="ProjectServer.Models.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
      <link rel="edit" href="http://localhost:61068/odata/Products(1)" />
      <link rel="self" href="http://localhost:61068/odata/Products(1)" />
      <title />
      <updated>2019-07-09T08:14:24Z</updated>
      <author>
        <name />
      </author>
      <content type="application/xml">
        <m:properties>
          <d:ID m:type="Edm.Int32">1</d:ID>
          <d:Name>Hat</d:Name>
          <d:Price m:type="Edm.Decimal">15.00</d:Price>
          <d:Category>Apparel</d:Category>
        </m:properties>
      </content>
    </entry>
    

    JSON的轻型版本

    {
      "odata.metadata":"http://localhost:61068/odata/$metadata#Products/@Element",
      "ID":1,
      "Name":"Hat",
      "Price":"15.00",
      "Category":"Apparel"
    }
    

    OData 协议版本 3 中引入了 JSON 轻型格式。 为了向后兼容性,客户端可以请求的较旧的"详细"JSON 格式。 若要请求详细 JSON,请将 Accept 标头设置为application/json;odata=verbose。 下面是详细的版本:

    {
      "d":{
        "__metadata":{
          "id":"http://localhost:18285/odata/Products(1)",
          "uri":"http://localhost:18285/odata/Products(1)",
          "type":"ProductService.Models.Product"
        },"ID":1,"Name":"Hat","Price":"15.00","Category":"Apparel"
      }
    }
    

    此格式会告知在响应正文中,可以极大地增加开销通过整个会话的多个元数据。 此外,它会通过包装在名为"d"的属性的对象添加一定程度的间接性。

  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/tangge/p/11158223.html
Copyright © 2011-2022 走看看