引經(jīng)據(jù)典
寫(xiě)文章的時(shí)候,我喜歡引經(jīng)據(jù)典,只要有需要,我就會(huì)引用曾經(jīng)看過(guò)的圖書(shū)。然而,和上一回提到的問(wèn)題類似,每當(dāng)我要引用一本圖書(shū)時(shí),我得首先打開(kāi)瀏覽器上網(wǎng)搜索一下這本書(shū),接著把這本書(shū)的一些基本信息,例如書(shū)名和作者,復(fù)制到文章里,然后插入這本書(shū)的超鏈接。有沒(méi)有辦法讓這個(gè)過(guò)程變得更加簡(jiǎn)單呢?如果我沒(méi)記錯(cuò)的話,Amazon.com提供了搜索圖書(shū)服務(wù),那么為什么不考慮把它集成進(jìn)來(lái)呢?
引入一個(gè)解決方案的同時(shí)會(huì)把與之相隨的問(wèn)題也引入來(lái),要成功把Amazon.com的搜索圖書(shū)服務(wù)集成到 word2007 里,我們就得回答下面這些問(wèn)題:
訪問(wèn)Amazon.com的搜索圖書(shū)服務(wù)有哪些條件/要求?
如何向這個(gè)服務(wù)發(fā)送請(qǐng)求?又如何解析服務(wù)返回的數(shù)據(jù)?哪些數(shù)據(jù)能用到這里來(lái)?
有用的數(shù)據(jù)如何組織和顯示?
尋找經(jīng)典
Amazon Web Service提供了兩種接口,一種是基于SOAP的,另一種是基于REST的,我將選用后者來(lái)完成本回的插件。本回面臨的第一個(gè)難點(diǎn)就是構(gòu)建滿足需求的REST請(qǐng)求,要做到這點(diǎn),就得先清楚需求是什么:
我希望按書(shū)名的部分或者全部進(jìn)行搜索;
我希望搜索的結(jié)果里面包括圖書(shū)的書(shū)名、圖書(shū)的作者、圖書(shū)的封面和圖書(shū)的超鏈接。
Amazon.com提供了Amazon E-Commerce Service Developer Guide,根據(jù)這份文檔,我構(gòu)建了如下所示的REST請(qǐng)求:
圖 1 - REST Request
它告訴Amazon Web Service:
我要請(qǐng)求的服務(wù)是AWSECommerceService,通過(guò)它我可以訪問(wèn)Amazon的產(chǎn)品數(shù)據(jù)庫(kù);
我的訪問(wèn)密鑰是什么,它可以通過(guò)在Amazon.com上注冊(cè)帳號(hào)獲得;
我要請(qǐng)求的操作是ItemSearch,通過(guò)它我可以搜索Amazon的產(chǎn)品數(shù)據(jù)庫(kù);
我要搜索書(shū)名包含"VSTO"字眼的圖書(shū)。
在瀏覽器里執(zhí)行這個(gè)請(qǐng)求將的到如下所示的搜索結(jié)果:
圖 2 - REST Response
搜索結(jié)果所包含的信息量可以通過(guò)ResponseGroup參數(shù)來(lái)控制,ItemSearch操作使用Small作為該參數(shù)的默認(rèn)值。通過(guò)把該參數(shù)的值該為Medium可以使返回的搜索結(jié)果包含圖書(shū)的封面:
圖 3 - REST Response with Image URLs
有了上面這些準(zhǔn)備知識(shí),我就可以著手實(shí)現(xiàn)搜索圖書(shū)這部分功能了。首先,構(gòu)建REST請(qǐng)求,并通過(guò)XElement.Load方法執(zhí)行之:
Code 1 - Execute REST Request
需要注意的是,由于REST請(qǐng)求是一個(gè)URL,而書(shū)名可以包含URL不允許的字符,于是在把書(shū)名加到REST請(qǐng)求之前要先對(duì)其進(jìn)行編碼。
接著,用LINQ to XML對(duì)搜索結(jié)果進(jìn)行處理:
Code 2 - Process REST Response
其中用到的輔助處理方法有:
Code 3 - REST Response Process Helpers
在命令行程序里使用BookSearch.Search方法搜索書(shū)名包含"VSTO"字眼的圖書(shū):