公共運輸整合資訊平台資料服務開發實作 日 期:2016
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 為什麼需要Odata(1/2) Client: 瀏覽器(ex: IE, firefox, chrome) 智慧型手機(ex: 安卓, ios) BI工具(ex: Excel) 開發軟體平台(ex: .NET, Java) 資料來源: 雲端儲存設備(ex: Azure) 企業管理系統(ex: SharePoint) 雲服務(尋找各式各樣的資料,包括人口統計、環境、金融、零售及運動) 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
為什麼需要Odata(2/2) 不同的客戶端要怎麼存取不同的資料來源,如果每一個客戶端都為了特定的資料來源端寫了特定的程式碼,那會是客戶端沉重的負擔 不同的客戶端有不同的需求,如果資料來源端都為了每一個客戶端定義不同的需求,那會是資料來源端沉重的負擔 因此定義一個通用的協定,兼容不同的情況,並採取Web導向的標準,正是需要Odata的原因
OData簡介 開放式資料協定(Open Data Protocol,簡稱OData)以REST原則,允許使用者透過HTTP方式存取資料,並能根據資料的模型進而查詢與更新 是由微軟支持且定義的協定,Odata Version 4.0已被結構化資訊標準促進組織(Organization for the Advancement of Structured Information Standards,OASIS)投票通過成為開放工業標準 該協定已定義了一組規則(可擴充),可組串成資源定位器(Uniform Resource Locator,簡稱URL)使用服務
OData簡介 OData允許不同的客戶端能存取不同的資料來源。 來源 Odata應用領域 資料來源端 開發軟體平台 雲端儲存設備 Facebook、Netflix and eBay 這些企業級應用對於開放式資料都可以透過OData來存取 雲端儲存設備 Azures內建OData資料表的存取協定 可利用 OData libraries存取Amazon的資料 企業管理系統 SharePoint 2010與Webnodes支援內建的OData存取公開資料 雲服務 以Windows Azure Marketplace DataMarket為基礎的服務用來搜尋、購買和存取商業資料皆能經由OData的方式讓應用程式存取這些資料集。 Client端 瀏覽器 Javascript與瀏覽器網址皆能對Odata來源資料存取 智慧型手機 Android、iOS、Windows Phone 7都支援OData client libraries BI工具 PowerPivot內建支援OData,其它如Tableau Desktop也支援OData NET Framework, Java, PHP和其它技術皆支援OData的程式。
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 REST(1/2) 表象化狀態轉變(Representational State Transfer, 簡稱REST),意指以 URL 定位資源, 根據HTTP動詞POST、GET、PATCH/PUT、DELETE..等動詞操作與回應訊息 兩個核心精神: 1. 使用Resource來當做識別的資源,也就是使用一個URL網址來代表一個Resource 2. 同一個Resource則可以有不同的Representations格式變化。 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 REST(2/2) 相較於SOAP、XML-RPC更為簡潔容易使用,也是眾多網路服務中最為普遍的API格式,像是Amazon、Yahoo!、Google等提供的API服務均有REST介面。 範例: POST /events (新增事件) GET /events/1 (取得某一筆事件) DELETE /events/1 (刪除某一筆事件) 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OASIS 結構化資訊標準促進組織(Organization for the Advancement of Structured Information Standards,OASIS)是一個非商業性的國際社團,致力於推動電子商務標準的開發與整合。來自100多個國家的600多家組織與企業,人數超過5000人的國際化組織 全部的工作將是通過公開投票的方式認可 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 URL(MOTC Web API)(1/3) Web API(application programming interface)的表現方式,如下圖,分為網站根目錄(App Root)、資源路徑(Resource Path)和查詢選項(Query Options): 網站根目錄:應用服務的基本網址。 資源路徑:指定資源項目路徑名稱。 查詢選項:指定欲取得資料的範圍或查詢的條件。 http://Domain/App/{Version}/{Service}/{App}?{QDataQueryQptions} |-App Root-| |----Resource Path----| |--Query Options--| 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 URL(MOTC Web API)(2/3) 網站根目錄(App Root) 網站根目錄的主要組成為(Domain)網域名稱和(App)應用程式名稱,並且透過 HTTP 協定連結而形成服務的基本網址。 Domain: ptx.transportdata.tw App : MOTC或PTX 資源路徑(Resource Path) 目錄結構 意義 Version(版本) 提供服務的版本號。目前提供 v1(第一版),若沒有輸入,則預設最新版本 Service(服務) 依據載具本身提供的服務,例如:鐵道:台鐵(TRA)、高鐵(THSRC),空運:航空(Aviation),道路:公車(Bus)等等。 Application(應用內容) 根據每個服務而提不同的應用內容,例如:航空:航班資訊(FIDS)和機場資訊(Airport)等。 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 URL(MOTC Web API)(3/3) 查詢選項(Query Options) MOTC WEB API 引入Odata為查詢選項,我們將在接下來幾篇投影片詳細介紹Odata的查詢選項及範例 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項 Odata 查詢方法(Odata Query Options) 意義 $top = n 表示回傳前 n 筆資料 $skip = n 表示略過前 n 筆資料 $orderby 決定資料的結果排序是升冪或 降冪 $filter 回傳符合特定表達式的資料 $select 回傳資料的某些欄位 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$select 使用API時,可允許Client端可透過$select語法回傳指定欄位(目前只針對第一層),多個欄位可用逗號(,)隔開 未指定$select,回傳全部欄位: http://Domain/App/{Version}/{Service}/{App} 只回傳欄位1 http://Domain/App/{Version}/{Service}/{App}?$select= Field1 回傳多個欄位,欄位1和欄位2 http://Domain/App/{Version}/{Service}/{App}?$select= Field1,Field2 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
OData查詢選項-$select 指定回傳結果的格式($format),會在後面做介紹 以MOTC 鐵路的Station API 為例: http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$select=StationID,StationAddress StationID與StationAddress必須是原回傳資料擁有的欄位 回傳結果只會有StationID與StationAddress欄位,但若有指定不同輸出格式,會有不同結果: 回傳資料指定為json時,只會回傳被select的欄位 回傳資料指定為xml,沒有被指定的屬性若為class或是string,不會回傳該欄位,但若是其他屬性(int,bool,enum..),還是會回傳該欄位,其值為系統預設值 指定回傳結果的格式($format),會在後面做介紹
OData查詢選項-$select 利用$select指定欄位,若回傳格式為XML如下
OData查詢選項-$select 利用$select指定欄位,若回傳格式為JSON如下,只會回傳被select的欄位
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 利用$filter語法可以篩選資料,其中提供了邏輯運算子(Logical Operators),算術運算子(Arithmetic Operators) ,規範函數(Canonical Functions)以及 Lambda Operators供使用者運用 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 邏輯運算子語法 邏輯運算子 意義 eq 等於 ne 不等於 gt 超過 ge 大於 lt 不及 le 小於 and 而且 or 或者 not 否定 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 邏輯運算子範例 取得公總公車動態定時,車牌號碼等於636-U7的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=PlateNumb eq '636-U7' 取得公總公車動態定時,行車狀況不等於正常的資料,由於行車狀況類型為Enum,因此要特別注意filter用法 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=BusStatus ne Service.Enumeration.Version1.Bus.BusStatusEnum'正常' 取得公總公車動態定時,行駛速度超過100的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed gt 100 取得公總公車動態定時,行駛速度大於100的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed ge 100 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 邏輯運算子範例 取得公總公車動態定時,行駛速度不及100的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed lt 100 取得公總公車動態定時,行駛速度小於100的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed le 100 取得公總公車動態定時,行駛速度不及100 而且 行車狀況不等於正常的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed lt 100 and BusStatus ne Service.Enumeration.Version1.Bus.BusStatusEnum'正常' 取得公總公車動態定時,行駛速度不及100 或是 行車狀況不等於正常的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed lt 100 or BusStatus ne Service.Enumeration.Version1.Bus.BusStatusEnum'正常' 取得公總公車動態定時,車牌號碼的結尾 不為U7 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=not endswith(PlateNumb,'U7') 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 算術運算子語法 算數運算子 意義 add 加 sub 減 mul 乘 div 除 mod 餘數 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 算術運算子範例 取得公總公車動態定時,行駛速度加 2等於102 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed add 2 eq 102 取得公總公車動態定時,行駛速度減 2等於102 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed sub 2 eq 102 取得公總公車動態定時,行駛速度乘 2等於102 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed mul 2 eq 102 取得公總公車動態定時,行駛速度除 2等於102 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed div 2 eq 102 取得公總公車動態定時,行駛速度除 2的餘數等於 2 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=Speed mod 2 eq 2 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數語法 規範函數 意義 substring 子字串 year 年份 round 四捨五入 endswith 字串結尾 month 月份 floor 直接往小的取 startswith 字串開頭 day 日 ceiling 直接往大的取 length 字串長度 hour 小時 cast 轉型 indexof 指定字串出現位置 minute 分 concat 串接 tolower 字串變小寫 second 秒 toupper 字串變大寫 fractionalseconds 小數秒 trim 去空白 date 日期 contains 包含 time 時間 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數範例: 取得公總公車動態定時,車牌號碼第0個位置開始算的2個字元為41的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=substring(PlateNumb,0,2) eq '41' 取得公總公車動態定時,車牌號碼的結尾 為U7 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=endswith(PlateNumb,'U7') 取得公總公車動態定時,車牌號碼的開頭 為U7 的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=startswith(PlateNumb,'U7') 取得公總公車動態定時,車牌號碼的長度為7的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=length(PlateNumb) eq 7 取得公總公車動態定時,車牌號碼開頭(第0個位置)為F的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=indexof(PlateNumb,'F') eq 0 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數範例: 取得公總公車動態定時,車牌號碼為小寫的字母 fa-185的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=tolower(PlateNumb) eq 'fa-185' 取得公總公車動態定時,車牌號碼為大寫的字母 FA-185的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=toupper(PlateNumb) eq 'FA-185' 取得公總公車動態定時,車牌號碼為去空白後的 FA-185的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=trim(PlateNumb) eq 'FA-185' 取得公總公車動態定時,車牌號碼為包含的 FA的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=contains(PlateNumb, 'FA') 取得公總公車動態定時,資料紀錄時間的年份為2015年的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=year(UpdateTime) eq 2015 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數範例: 取得公總公車動態定時,資料紀錄時間的月份為9月的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=month(UpdateTime) eq 9 取得公總公車動態定時,資料紀錄時間的日期為18號的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=day(UpdateTime) eq 18 取得公總公車動態定時,資料紀錄時間的小時為17點的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=hour(UpdateTime) eq 17 取得公總公車動態定時,資料紀錄時間的分鐘為第17分的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=minute(UpdateTime) eq 17 取得公總公車動態定時,資料紀錄時間的秒數為第1秒的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=second(UpdateTime) eq 1 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數範例: 取得公總公車動態定時,資料紀錄時間的毫秒為0.1秒的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=fractionalseconds(UpdateTime) eq 0.1 取得公總公車動態定時,資料紀錄時間的日期格式為2015-09-17T17:57:00+08:00的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=date(UpdateTime) eq 2015-09-17 取得公總公車動態定時,資料紀錄時間的時間格式為2015-09-17T17:57:00+08:00的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=time(UpdateTime) eq 11:59:48 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter 規範函數範例: 取得公總公車動態定時,行駛速度四捨五入為12的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=round(Speed) eq 12 取得公總公車動態定時,行駛速度去小數,直接往小的整數進位為12的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=floor(Speed) eq 12 取得公總公車動態定時,行駛速度去小數,直接往大的整數進位為12的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=ceiling(Speed) eq 12 取得公總公車動態定時,行駛速度轉型成字串為12的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=cast(Speed,Edm.String) eq '12' 取得公總公車動態定時,車牌號碼前面串接台北兩個字 為 台北636-U7的資料 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=concat('台北',PlateNumb) eq '台北636-U7' 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter Lambda Operators語法 Lambda Operators 意義 all 所有項目都要符合 any 其中一項符合 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$filter Lambda Operators範例 取得高鐵車次時,針對停靠時間資料底下的車站代碼,其中一筆的車站代碼為1000的資料就回傳 http://ptx.transportdata.tw/MOTC/Rail/THSR/DailyTimetable?$filter=StopTimes/any(d:d/StationID eq '1000') 取得高鐵車次時,針對停靠時間資料底下的車站代碼,全部的車站代碼為1000的資料就回傳 http://ptx.transportdata.tw/MOTC/Rail/THSR/DailyTimetable?$filter=StopTimes/all(d:d/StationID eq '1000') 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究 OData查詢選項-$orderby 使用API時,可允許Client端可透過$orderby語法針對指定欄位做排序,多個欄位可用逗號(,)隔開,升冪(asc)或降冪(desc) 針對欄位1作升冪(預設為升冪) http://Domain/App/{Version}/{Service}/{App}?$orderby= Field1 針對欄位1作升冪 http://Domain/App/{Version}/{Service}/{App}?$orderby= Field1 asc 針對欄位1作降冪 http://Domain/App/{Version}/{Service}/{App}?$orderby= Field1 desc 針對欄位1作升冪,欄位2降冪 http://Domain/App/{Version}/{Service}/{App}?$orderby= Field1 asc, Field2 desc 智慧財產權屬資拓宏宇國際(股)公司,複製或轉載必究
OData查詢選項-$orderby 指定回傳資料以UpdateTime欄位來排序 以MOTC 鐵路的Station API : http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$orderby=UpdateTime 指定回傳資料以UpdateTime欄位來排序
OData查詢選項-$skip and $top 以MOTC 鐵路的Station API : http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$skip=10 忽略回傳資料的前10筆資料 http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$top=10 只取回傳資料的前10筆資料
OData查詢選項-$format 以MOTC 鐵路的Station API : http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$format=json 回傳json格式 http://ptx.transportdata.tw/MOTC/Rail/TRA/Station?$format=xml 回傳xml格式
OData查詢選項-複合查詢 取得公總公車動態定時,車牌號碼的結尾 為U7 的前30筆資料,並以行駛速度升冪排序 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$filter=endswith(PlateNumb,'U7')&$top=30&$orderby=Speed asc 取得公總公車動態定時,行駛速度的第1個位置為2,且只回傳行駛速度和車牌號碼 http://ptx.transportdata.tw/MOTC/Bus/RealTimeByFrequency/Thb?$select=PlateNumb,Speed&$filter=substring(cast(Speed,Edm.String),1) eq '2' 取得公車站牌與路線時,只要經過的其中一站牌的StopOID有包含185就回傳,且只回傳前10筆 http://ptx.transportdata.tw/MOTC/Bus/StopOfRoute/Thb?$top=10&$filter= StopIDs /any(d:(contains(d/StopOID,'185') eq true))