三、 系統分析與實作
3.2 應用程式介面實作
3.2.4 應用程式介面提供的服務
如圖 3-13,DOD API 由 NCTUAdapter、Token 機制與書後附件檔案三個部分組成,
並藉由這三部分交互作用提供 DOD API 的各項服務 (Services),服務的要求方式為以 URI 搭配 HTTP 方法 (GET、POST 等等)。
其中 NCTUAdapter 可能因更換自動化系統而被改寫;Token 可使用資料庫而非記憶 體儲存;書後附件檔案可以被存成 ISO 9660 格式或是壓縮檔,收到要求時再經過解壓
39
縮後傳回,甚至存在雲儲存 (Cloud Storage) 中。不管內部的如何變化,DOD API 需保 證對外開放的服務其要求方式不變。
圖 3-13 DOD API 組成圖
DOD API 總共包含了五個服務:
1. 驗證帳號密碼 http://ServerIP/accounts/login 2. 取得驗證圖片 http://ServerIP/accounts/captcha 3. 取得讀者目前借閱紀錄 http://ServerIP/records 4. 取得書後附件檔案結構 http://ServerIP/discs/[條碼號]
5. 下載書後附件檔案 http://ServerIP/discs/[條碼號]/[檔案名稱]
將五個服務分述於下:
40
1. 驗證帳號密碼 http://ServerIP/accounts/login
此服務最主要目的為檢查帳號密碼並發給一個 Token,使用者之後每次要求其它 API 服務時,必需將此 Token 附加於 HTTP 要求中,詳細流程圖如圖 3-14。回傳的結果 為圖 3-15。此功能設計上較為複雜,需考慮下列三點:
(1). Token 產生後不能永遠存在記憶體中,否則將耗盡所有記憶體資源,必須有機制對 不再使用的 Token 進行刪除並將記憶體回收,本研究的作法是如果在六十分鐘內此 Token 未被使用就刪除 Token。
(2). 由帳號密碼的錯誤次數,送出要求的頻率等等特徵,判斷要求此服務的是人還是機 器,決定要求 CAPTCHA 挑戰。本研究的作法是只要帳號密碼錯誤一次就要求 CAPTCHA 挑戰。
(3). 與自動化系統連結認證帳號密碼則是使用 NCTUAdapter 以傳入的帳號 (userid) 與 密碼(password)為參數呼叫 GetUser 方法,如果傳回的 User 物件不為 NULL 即代表 認證成功並發給 Token。
41
圖 3-14 DOD API 之帳號密碼認證服務流程圖
42
圖 3-15 Token 之 XML 格式示例與說明
2. 取得驗證圖片 http://ServerIP/accounts/captcha
當 DOD API 判斷需要 CAPTCHA 挑戰時,會回傳使用者如圖 3-15 第三部分格式的 XML,使用者者解析 XML 得到 Token (並非認證成功後傳回的 Token),並將其包含在 HTTP 表頭中,對 http://ServerIP/accounts/captcha 發出 HTTP 請求,即可得到一個如圖 3-16 的圖形驗證碼。
認證成功回傳 Token
<?xml version="1.0" encoding="utf-8"?>
<Token>
<Id>ASP.NET_SessionId=ipstt345ohytw255rxwgnkfs</Id>
</Token>
認證失敗
<?xml version="1.0" encoding="utf-8"?>
<Error>
<Message> UnAuthentication</Message>
<Token/>
</Error>
認證失敗要求進行 CAPTCHA 挑戰
<?xml version="1.0" encoding="utf-8"?>
<Error>
<Message>CaptchaRequired</Message>
<Token>ASP.NET_SessionId=knwvmq332om0ee3o3r3dvhbn</Token>
</Error>
<Token>:用以取得驗證圖片的 token,並非系統 token
<Id>:即為 token
43
HTTP 要求(Request)
GET /acounts/captcha HTTP/1.1 Host : http://ServerIP
Cookie : ASP.NET_SessionId=knwvmq332om0ee3o3r3dvhbn HTTP 回應(Response)
圖 3-16 圖形驗證碼
3. 取得讀者目前借閱紀錄 http://ServerIP/records
此服務功能為傳回讀者的目前借閱紀錄,使用者發出的 HTTP 請求需包含認證成功 後取得的 Token,DOD API 以 Token 判斷讀者是否登入成功,之後以 Token 為索引取得 帳號(userid),並實例化 NCTUAdapter 使用 GetRecordsByUserId 方法取得讀者目前借閱 紀錄回傳給讀者,詳細的流程圖如圖 3-17。回傳的結果為圖 3-18。
44
圖 3-17 DOD API 之取得讀者目前借閱紀錄服務流程圖
45
圖 3-18 借閱紀錄 XML 格式示例與說明
<?xml version="1.0" encoding="utf-8"?>
<List>
<DiscSize>640000000</DiscSize>
<Rights>
<UserId>0796795451</UserId>
<BeginDate>2009-11-02T12:12:00</BeginDate>
<EndDate>2010-01-02T23:59:00</EndDate>
</Rights>
<DiscSize>640000000</DiscSize>
<Rights>
<UserId>0796795451</UserId>
<BeginDate>2009-11-02T12:12:00</BeginDate>
<EndDate>2010-01-02T23:59:00</EndDate>
</Rights>
<DiscId>:條碼號(唯一 ID)
<DiscName>:書後附件名稱
<DiscSize>:書後附件光碟容量
<UserId>:讀者 ID
<BeginDate>:借閱日期
<EndDate>:歸還日期
46
4. 取得書後附件檔案結構 http://ServerIP/discs/[條碼號]
此服務功能為取得指定條碼號的書後附件檔案結構,使用者除傳入 Token 外還需提 供書後附件條碼號(discid),DOD API 將書後附件的目錄與檔案結構表示成 XML 格式,
並回傳給使用者,詳細的流程圖如圖 3-19。回傳的結果為圖 3-20。
圖 3-19 DOD API 之取得書後附件目錄與檔案結構服務流程圖
47
圖 3-20 書後附件檔案結構 XML 格式示例與說明
<?xml version="1.0" encoding="utf-8"?>
<Dictionary>
<Attributes>Archive</Attributes>
<CreationTime>2009-11-18T19:06:00.84375+08:00</CreationTime>
<LastAccessTime>2009-11-20T04:51:42.9375+08:00</LastAccessTime>
<LastWriteTime>1999-06-01T19:44:08+08:00</LastWriteTime>
<Length>825</Length>
<FileName>setup_notes.txt</FileName>
</FileInformation>
</value>
</item>
<item>
<key>
<string>\Chapter2</string>
</key>
<value>
<FileInformation>
<Attributes>Directory</Attributes>
<CreationTime>2009-11-18T19:06:00.84375+08:00</CreationTime>
<LastAccessTime>2009-11-25T15:51:42.03125+08:00</LastAccessTime>
<LastWriteTime>2009-11-18T19:06:00.96875+08:00</LastWriteTime>
<Length>0</Length>
48
5. 下載書後附件檔案 http://ServerIP/discs/[條碼號]/[檔案名稱]
此服務功能為取得書後附件檔案,使用者提供 Token,條碼號與檔案名稱,DOD API 回傳二進位檔案,詳細的流程圖如圖 3-21。
圖 3-21 下載書後附件檔案
49