开放数据协议(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"的属性的对象添加一定程度的间接性。
来源:https://www.cnblogs.com/tangge/p/11158223.html