複製鏈接
請複製以下鏈接發送給好友

開放數據協議

鎖定
開放數據協議(Open Data Protocol,簡稱OData)是一種描述如何創建和訪問Restful服務的OASIS標準。該標準由微軟發起 [1]  ,前三個版本1.0、2.0、3.0都是微軟開放標準,遵循微軟開放規範承諾書(Microsoft Open Specification Promise)。第四個版本4.0於2014年3月17日在OASIS投票通過成為開放工業標準 [2] 
中文名
開放數據協議
外文名
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] 

開放數據協議協議組成

開放數據協議主要由以下幾個部分組成:
  • 核心協議
核心協議主要定義了開放數據協議的核心語義和行為。它們包括:
  • 數據模型
  • 服務模型
  • 協議和模型的版本管理
  • 拓展性
  • 數據格式
  • HTTP
  • HTTP狀態碼
  • 上下文URL(context URL)
  • 數據請求和響應
  • 安全性
  • 一致性(Conformance)
  • 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格式
JSON格式主要定義了OData的請求和響應的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 內置過濾操作符 [4] 
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 內置查詢函數 [5] 
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)
  • 數據修改請求
待編輯
參考資料