-
開放數據協議
鎖定
- 中文名
- 開放數據協議
- 外文名
- Open Data Protocol (OData)
- 標準組織
- OASIS
- 最新版本
- 4.0
開放數據協議發展簡史
- 協議發起
開放數據協議(Open Data Protocol,簡稱OData)是由微軟於2007年發起的開放協議
[1]
。當時的開發代號叫“Project Astoria”。於2009年更名為Open Data Protocol
[3]
。
- 協議在微軟內部的演進
開放數據協議在微軟內部演進了三個主要的版本,分別是1.0(2007年),2.0(2009年)和3.0(2009年以後)。
- 協議成為OASIS標準
2014年3月17日,開放數據協議經由OASIS批准,正式成為開放工業標準
[2]
。
開放數據協議協議組成
開放數據協議主要由以下幾個部分組成:
- 核心協議
核心協議主要定義了開放數據協議的核心語義和行為。它們包括:
- URL規範
URL規範主要定義了一系列推薦(非強制)採用的構建用於訪問OData服務中的數據和模型的URL的規則。它們包括:
- URL的組成部分
- 服務的根URL
- 資源路徑
- 查詢語句
- 通用格式定義語言(CSDL)
OData服務的數據模型是通過EDM(實體數據模型)來定義的。通用格式定義語言(Common Schema Definition Language (CSDL))定義了OData服務的EDM模型的一種XML格式的表現形式。它的內容包括:
- CSDL的命名空間
- 實體模型的封裝
- 實體模型的普通特性
- 具體的XML元素和屬性介紹
- 擴展的巴科斯範式(ABNF)
ABNF定義了構建OData請求和響應URL的巴科斯範式。它的包括對以下組成部分的描述:
- 資源路徑
- 查詢語句
- 上下文URL(context URL)
- 表達式
- OData函數參數的JSON格式
- 命名與標識符(identifiers)
- 數據字面值(literal data values)
- 標頭值(header values)
- 標點符號
開放數據協議協議拓展
- JSON格式
- Atom格式
Atom格式主要定義了OData的請求和響應的Atom表現形式。
- 詞彙表(vocabulary)
OData協議中的詞彙表主要用來用户為OData服務添加註解 (annotations)。例如,某個屬性是否可讀等。
- 數據聚合(data aggregation)拓展
數據聚合拓展主要為OData增加了聚合的概念。它定義了數據聚合的語義和表現形式,尤其是:
- 查詢聚合數據的語義和表現形式
- 查詢聚合數據的結果格式
- 標記何種數據可以被聚合,如何聚合的詞彙(vocabulary term)
開放數據協議協議請求示例
- 數據請求
1. 請求一個實體集合(an entity set)
GET ~/Customers
"~"符號代表OData服務的根目錄
2. 請求一個單獨的實體(a single entity)
GET ~/Customers(1)
OData採用圓括號作為表示單獨實體的鍵值的字段(key segment)
3. 請求一個屬性(a property)
GET ~/Customers(1)/Name
在OData服務的模型中,實體類型(entity type)具有屬性。屬性可以理解為該實體類型的數據成員。
3.1 請求一個屬性的原始值(raw value of a property)
GET ~/Customers(1)/Name/$value
相比於#3中的請求,對於屬性原始值的請求的響應將不再是一個JSON或者Atom的對象,而是該屬性的原始數據。比如純文本,或者二進制流(對於類型為Edm.Stream的屬性)。
4. 查詢語句
4.1 選擇查詢($select)
GET ~/Customers?$select=Name,Age
$select用於選擇實體的哪些屬性被包含在返回的數據中。
4.2 展開查詢($expand)
GET ~/Customers?$expand=Orders
OData中的實體類型之間有關係(relationship)。比如顧客(Customer)類型可以有一系列的訂單(Orders)。這樣一來,顧客類型與訂單類型相關。顧客類型上可以定義導航屬性(navigation property)用於描述這種關係(如上例中Customer類型的Orders屬性)。$expand的查詢幫助將實體類型的導航屬性的值加入請求的返回數據中。
4.3 過濾查詢($filter)
GET ~/Customer?$filter=Age gt 35
OData內置了一系列如上面例子中"gt"的過濾操作符(filter operations)和一些查詢函數(query functions)用來支持不同的過濾查詢需求。
4.3.1.1 比較操作符
操作符 | 描述 | 例子 |
eq | 等於 | Address/City eq '上海' |
ne | 不等於 | Address/City ne '上海' |
gt | 大於 | Price gt 20 |
ge | 大於等於 | Price ge 10 |
lt | 小於 | Price lt 20 |
le | 小於等於 | Price le 100 |
has | 有標誌(flags) | Style has Sales.Color'黃色' |
4.3.1.2 邏輯操作符
操作符 | 描述 | 例子 |
and | 邏輯與 | Price le 200 and Price gt 3.5 |
or | 邏輯或 | Price le 3.5 or Price gt 200 |
not | 邏輯非 | not endwith(Description, '牛奶') |
4.3.1.3 算數操作符
操作符 | 描述 | 例子 |
add | 加 | Price add 5 gt 10 |
sub | 減 | Price sub 5 gt 10 |
mul | 乘 | Price mul 2 gt 2000 |
div | 除 | Price div 2 gt 4 |
mod | 取模 | Price mod 2 eq 0 |
4.3.1.4 分組操作符
操作符 | 描述 | 例子 |
( ) | 優先級分組 | (Price sub 5) gt 10 |
4.3.2.1 字符串函數
函數 | 例子 |
contains | contains(CompanyName, '公司') |
endswith | endswith(CompanyName, '公司') |
startswith | startswith(CompanyName, '中國') |
length | length(CompanyName) eq 6 |
indexof | indexof(CompanyName, '國') eq 1 |
substring | substring(CompanyName, 1) eq '國開放數據有限公司' |
tolower | tolower(EnglishName) eq 'ABC' |
toupper | toupper(EnglishName) eq 'abc' |
trim | trim(FullName) eq 'Russell Whyte' |
concat | concat(concat(City, ','), Country) eq '中國,上海' |
4.3.2.2 字符串函數
函數 | 例子 |
year | year(BirthDate) eq 0 |
month | month(BirthDate) eq 12 |
day | day(StartTime) eq 8 |
hour | hour(StartTime) eq 1 |
minute | minute(StartTime) eq 0 |
second | second(StartTime) eq 0 |
fractionalseconds | fractionalseconds(StartTime) eq 0 |
date | date(StartTime) ne date(EndTime) |
time | time(StartTime) le StartOfDay |
totaloffsetminutes | totaloffsetminutes(StartTime) eq 60 |
now | StartTime ge now() |
mindatetime | StartTime eq mindatetime() |
maxdatetime | EndTime eq maxdatetime() |
4.3.2.3 數學函數
函數 | 例子 |
round | round(Freight) eq 32 |
floor | floor(Freight) eq 32 |
ceiling | ceiling(Freight) eq 33 |
4.3.2.4 類型函數
函數 | 例子 |
cast | cast(ShipCountry, Edm.String) |
isof | isof(NorthwindModel.Order) |
isof | isof(ShipCountry, Edm.String) |
4.3.2.5 Geo函數(用於地理、測繪等)
函數 | 例子 |
geo.distance | geo.distance(CurrentPosition, TargetPosition) |
geo.length | geo.length(DirectRoute) |
geo.intersects | geo.intersects(Position, TargetArea) |
- 數據修改請求
待編輯
- 參考資料
-
- 1. Welcome! .OData Team.2007-06-17[引用日期2015-01-06]
- 2. OASIS Approves OData 4.0 Standards for an Open, Programmable Web .OASIS官網.2014-03-17[引用日期2015-01-06]
- 3. Breaking Down ‘Data Silos’ – The Open Data Protocol (OData) .OData Team.2009-11-17[引用日期2015-01-06]
- 4. Built-in Filter Operations .OData Version 4.0 Part 1: Protocol[引用日期2015-01-07]
- 5. Built-in Query Functions .OData Version 4.0 Part 1: Protocol[引用日期2015-01-07]