开放数据协议(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"的属性的对象添加一定程度的间接性。

最新文章

  1. iOS 开发技术牛人博客
  2. 自定义 placeholder 文本颜色
  3. 初识Asp.net Identity
  4. 1891: 丘比特的烦恼 - BZOJ
  5. Java中Scanner的使用方法
  6. UOJ 218 火车管理
  7. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习
  8. PHP学习笔记,自己动手写个MVC的框架 -- base所有代码
  9. 设计模式(十)享元模式Flyweight(结构型)
  10. c# 获取客户端ip
  11. Azure 基础:使用 powershell 创建虚拟网络
  12. 一个成功的 Git 分支模型(适用于商业应用开发)
  13. KMP及其改进算法
  14. win 解压安装mysql步骤
  15. FPGA-VHDL课堂学习笔记*01
  16. new delate he typedef的含义
  17. partition
  18. java 异常历史 和观点
  19. 使用Synchronized关键字同步类方法
  20. 用正则表达式输出rdf文档的三元组格式数据

热门文章

  1. 高并发下redis
  2. 【转】Rxjs知识整理
  3. 《少年先疯队》第八次团队作业:Alpha冲刺第一天
  4. 《The One!团队》第八次作业:ALPHA冲刺(二)
  5. python_并发编程——锁
  6. machine learning (4)---feature scaling
  7. JavaScript基础——数组
  8. asp.net大文件分块上传断点续传demo
  9. 特别的表格(overflow:hidden的一个小应用)
  10. flutter 从接口获取json数据显示到页面