探索 Word 2007 开发 II(二):引用 Amazon 图书信息
Written by Allen Lee
引经据典
写文章的时候,我喜欢引经据典,只要有需要,我就会引用曾经看过的图书。然而,和上一回提到的问题类似,每当我要引用一本图书时,我得首先打开浏览器上网搜索一下这本书,接着把这本书的一些基本信息,例如书名和作者,复制到文章里,然后插入这本书的超链接。有没有办法让这个过程变得更加简单呢?如果我没记错的话,Amazon.com提供了搜索图书服务,那么为什么不考虑把它集成进来呢?
引入一个解决方案的同时会把与之相随的问题也引入来,要成功把Amazon.com的搜索图书服务集成到Word 2007里,我们就得回答下面这些问题:
- 访问Amazon.com的搜索图书服务有哪些条件/要求?
- 如何向这个服务发送请求?又如何解析服务返回的数据?哪些数据能用到这里来?
- 有用的数据如何组织和显示?
寻找经典
Amazon Web Service提供了两种接口,一种是基于SOAP的,另一种是基于REST的,我将选用后者来完成本回的插件。本回面临的第一个难点就是构建满足需求的REST请求,要做到这点,就得先清楚需求是什么:
- 我希望按书名的部分或者全部进行搜索;
- 我希望搜索的结果里面包括图书的书名、图书的作者、图书的封面和图书的超链接。
Amazon.com提供了Amazon E-Commerce Service Developer Guide,根据这份文档,我构建了如下所示的REST请求:
Figure 1 - REST Request
它告诉Amazon Web Service:
- 我要请求的服务是AWSECommerceService,通过它我可以访问Amazon的产品数据库;
- 我的访问密钥是什么,它可以通过在Amazon.com上注册帐号获得;
- 我要请求的操作是ItemSearch,通过它我可以搜索Amazon的产品数据库;
- 我要搜索书名包含"VSTO"字眼的图书。
在浏览器里执行这个请求将的到如下所示的搜索结果:
Figure 2 - REST Response
搜索结果所包含的信息量可以通过ResponseGroup参数来控制,ItemSearch操作使用Small作为该参数的默认值。通过把该参数的值该为Medium可以使返回的搜索结果包含图书的封面:
Figure 3 - REST Response with Image URLs
有了上面这些准备知识,我就可以着手实现搜索图书这部分功能了。首先,构建REST请求,并通过XElement.Load方法执行之:
Code 1 - Execute REST Request
需要注意的是,由于REST请求是一个URL,而书名可以包含URL不允许的字符,于是在把书名加到REST请求之前要先对其进行编码。
接着,用LINQ to XML对搜索结果进行处理:
Code 2 - Process REST Response
其中用到的辅助处理方法有:
Code 3 - REST Response Process Helpers
在命令行程序里使用BookSearch.Search方法搜索书名包含"VSTO"字眼的图书:
Code 4 - Test BookSearch.Search Method
却抛出了NullReferenceException:
Figure 4 - Oops! NullReferenceException is Raised
原来,搜索结果里面有一本书没有图片。由于并非每本书都有图片的,所以图片数据的辅助处理方法应先检查对应的XML元素是否存在,存在则进一步解析并返回图片的地址,否则返回null:
Code 5 - New Version of GetImageUrl Method
再次运行Code 4,可以看到正确的结果了:
Figure 5 - Process Results
列举经典
不知不觉又到设计UI的时候了,由于UI的设计与用户的操作息息相关,于是我们得先看看用户希望怎么操作这个插件:
- 点击Ribbon上的Amazon Book按钮打开搜索图书的窗口;
- 输入搜索关键字,并点击搜索;
- 在搜索结果中选择想要引用的图书;
- 插入选中图书的超链接。
此外,我们还需要进一步细化搜索结果的那些数据将显示在搜索图书窗口里:
- 图书的封面;
- 图书的完整标题;
- 图书的作者列表。
有了上面这些准备,我们就可以设计搜索图书窗口了。首先,在项目里添加如下所示的窗口:
Figure 6 - Search Book Window
这个窗口是使用Component Factory的Krypton Toolkit控件包开发的,里面包含:
- 给用户输入书名的编辑框;
- 执行搜索的按钮(Go按钮);
- 显示搜索结果的ListView控件;
- 显示选定图书的书名的Label控件;
- 显示选定图书的作者的Label控件;
- 插入选定图书的超链接的按钮(Link按钮);
- 关闭窗口的按钮(Close按钮)。
一开始,用户没有在编辑框输入任何东西,而ListView控件也没有显示任何结果,Go按钮和Link按钮应该是屏蔽状态(disable)的。当用户在编辑框了输入了东西,Go按钮会被激活:
Code 6 - Enable/Disable Go Button
同理,Link按钮也会在用户选定某本图书后激活:
Code 7 - Enable/Disable Link Button
当用户点击Go按钮时,将执行下列操作:
- 通过BookSearch.Search方法获取搜索结果;
- 构建用于ListView显示图书封面的ImageList对象;
- 向ListView填充搜索结果。
对于第二步,我们需要ImageManager的帮忙:
Code 8 - ImageManager
有了它,Go按钮就可以完成它的任务了:
Code 9 - EventHandler for Click Event of Go Button
ListView是一个不错的东西,但它不能单独为每个项指定图标,这是我最讨厌的。另外,你也可以对图片进行本地缓存,并让ImageManager在获取图片的时候先查看本地缓存,没有的话再去Amazon.com那里要。
当用户选定某本图书时,我们需要把它的书名和作者显示在ListView下面的两个Label上,于是我把ListView的SelectedIndexChanged事件委托修改了一下:
Code 10 - EventHandler for SelectedIndexChanged Event of ListView
回到Ribbon的设计上,我们需要一个按钮来打开搜索图书窗口,为此,我在Ribbon上添加了一个SplitButton,之所以选择它而不是普通的Button,乃因我脑海里一个突如其来的想法,稍后将会为你剖析这个想法的来龙去脉。添加了SplitButton后的Ribbon如下图所示:
Figure 7 - Amazon Book SplitButton on Ribbon
然后实现SplitButton的Click事件委托:
Code 11 - EventHandler for Click Event of Amazon Book SplitButton
好了,运行插件看看效果:
Figure 8 - Oops! The Value of ImageUrl is null
噢,抛了一个ArgumentNullException异常!还记得我是怎么处理ImageUrl吗?在Code 5里,当Amazon Web Service返回的搜索结果里面某本图书没有图片时,BookSearch.GetImageUrl方法返回null,类似地,ImageManager.GetImage方法也应该在遇到这种情况时返回一个"占位图片":
Code 12 - New Version of GetImage Method
再次运行插件,可以看到预期的效果了:
Figure 9 - Search Results
连接经典
终于轮到本回的主角出场了,当用户点击搜索图书窗口的Link按钮时将在当前文档的光标处插入选定图书的超链接:
Code 13 - EventHandler for Click Event of Link Button
虽然我现在可以通过搜索图书窗口插入图书的超链接,然而在大多数时候我更愿意遵循以下步骤插入图书的超链接:
- 在文档的某个位置输入要插入超链接的图书的书名;
- 选中这个书名,使之处于高亮(highlight)状态;
- 点击Ribbon上的Amazon Book按钮打开搜索图书的窗口,此时,这个书名显示在编辑框里,而搜索结果则显示在ListView里,并且第一本书处于选中状态;
- 如果选定的图书不是我要找的,则在搜索结果里重新选择;
- 点击Link按钮插入选定的图书的超链接。
为此,我需要为搜索窗口添加Load事件委托:
Code 14 - EventHandler for Load Event of BookSearchView
由于搜索窗口的Load事件委托和Go按钮的Click事件委托都需要执行搜索操作和向ListView填充搜索结果,所以我把这部分代码提取出来以便重用,这样Go按钮的Click事件委托就可以简化为:
Code 15 - New Version of Click EventHandler for Go Button
此时,当我点击Link按钮,原先选中的那个书名将被替换成从Amazon.com获取的完成的书名以及作者的名字,但我希望在原先选中的那个书名的基础上插入超链接并追加作者的名字,于是,我把Link按钮的Click事件委托里为textToDisplay变量赋值的代码改成下面这样:
Code 16 - Assignment to textToDisplay Variable
幸运经典
还记得在设计Ribbon的时候把Amazon Book按钮设为SplitButton而非普通的Button吗?之所以这样做,是因为我希望为这个插件添加一个比较特别的功能,类似于Google的"手气不错"(I'm Feeling Lucky)。我为Amazon Book按钮的下拉菜单添加了两个(普通)按钮,一个是Amazon Book按钮,另一个是Lucky Book按钮,运行起来像这样:
Figure 10 - Lucky Book
其中,下拉菜单里的Amazon Book按钮的效果和Amazon Book主按钮一样,而Lucky Book按钮的效果则和Google的"手气不错"相似。当我在文档的某个位置输入要插入超链接的图书的书名,选中这个书名并点击Lucky Book按钮时,它将会执行基于这个书名的搜索,并插入搜索结果中第一本书的超链接。如果用户在没有选中任何文字的情况下点击Lucky Book按钮或者搜不到指定的图书,则告知用户相关信息。
Code 17 - Insert Lucky Book
至此,Amazon Book插件的开发要告一段落了,虽然我还想实现更加完善的图片管理功能,虽然我还想提供更加丰富的搜索方式,虽然我还想通过配置让插件变得更加灵活,虽然……
分享到:
相关推荐
在这个主题中,我们将深入探讨亚马逊SP-API、SDK、开发文档以及开发者注册流程,并触及亚马逊广告开发的相关知识点。 首先,SP-API是亚马逊为了优化和扩大其生态系统而推出的新一代API,它取代了旧版MWS...
【亚马逊接口 .NET开发包 AWSToolsAndSDKForNet】是一个专门为.NET开发者设计的工具集,它提供了全面的API和库,以便与亚马逊Web服务(AWS)的各种产品进行交互。这个开发包允许开发者轻松地在.NET环境中构建、部署...
### QCon 2009 Beijing全球企业开发大会——亚马逊Web Services实战 #### 演讲嘉宾:Jeff Barr 在2009年的QCon北京全球企业开发大会上,Jeff Barr作为亚马逊的云计算战略师,为参会者带来了一场关于亚马逊Web ...
### Amazon Associates Web Service开发手册知识点概述 #### 一、引言 《Amazon Associates Web Service开发手册》是一份针对开发者的重要指南,旨在介绍如何利用Amazon Associates Web Service (简称AAWS)来构建...
1. **Amazon EMR定义**:Amazon Elastic MapReduce(EMR)是亚马逊提供的一个基于云的大数据处理服务,它使用Hadoop框架以及其他数据处理框架(如Apache Spark)来处理海量数据。 2. **Amazon EMR用途**:主要用于...
在 Laravel 开发中集成 Amazon Marketplace Web Service (MWS) 是一项常见的任务,特别是对于那些希望管理亚马逊店铺、库存、订单和其他商业数据的开发者而言。Amazon MWS 是亚马逊提供的一个API接口,允许开发者...
亚马逊图书管理系统是一款基于Java Web技术实现的优秀获奖作品,它主要采用了JSP(JavaServer Pages)和Struts框架,旨在提供一个高效、易用且功能丰富的图书管理平台。该系统设计考虑了图书馆日常运营的需求,如...
亚马逊(Amazon)作为全球最大的电商平台,提供了丰富的API接口供开发者使用,进行电商开发。这些接口使得第三方开发者可以构建与亚马逊平台深度集成的应用,实现商品管理、订单处理、库存跟踪等功能。下面将详细...
亚马逊图书书目数据库查询接口是Amazon Product Advertising API(产品广告API)的一部分,它允许开发者通过编程方式访问亚马逊的海量商品信息,包括图书、音乐、电影等各类产品数据。这个API对于构建在线书店、商品...
在跨境电商领域,特别是针对亚马逊平台的新品开发,卖家需要有一套科学的方法来确保产品的成功推出。以下是亚马逊新品开发的主要方法: 1. **亚马逊新品开发思路**: - **从需求出发,跟着市场走**:亚马逊作为...
7、客户声音:引用了技术合伙人/服务工程团队负责人的话,说明了使用亚马逊云科技的理由,包括全球部署能力、降低开发运维成本、保证服务可靠性和稳定性。 AI在游戏开发中的应用:Andy Jassy, Amazon CEO,提到了AI...
【标题】"国外技术干货:amazon-dynamo-sosp2007.zip" 指向的是一个关于Amazon Dynamo的深度解析资源包,该资源可能包含了2007年在SOSP(Symposium on Operating Systems Principles)会议上发表的亚马逊Dynamo论文...
【亚马逊(Amazon)的赢利推广模式】 亚马逊作为全球电商巨头,其成功的赢利推广模式在互联网商业领域具有深远影响。公司自1994年由Jeffrey Bezos创立以来,一直秉持创新和科技驱动的理念,从最初的在线书店发展...
在本文中,我们将深入探讨如何使用 Laravel 框架集成亚马逊支付服务,即Amazon Pay,以便在您的电子商务网站上提供安全、便捷的支付选项。Laravel 是一个流行的PHP框架,以其优雅的语法和强大的功能而受到开发者的...
本资源为美国Amazon亚马逊新手开店视频教程的第20-06节,主要内容为Amazon平台优化。通过这节视频教程,新手卖家可以学习到Amazon平台的优化方法,提高销售额和排名。 知识点: 1. Amazon平台优化的重要性:在...
### Amazon SimpleDB 开发文档知识点解析 #### 一、概览 **Amazon SimpleDB** 是亚马逊网络服务(AWS)提供的一项非关系型数据库服务。它主要用于存储和查询结构化数据集,并快速返回结果。该服务支持多种编程语言...
Amazon Redshift是亚马逊推出的一种云数据仓库服务,旨在帮助开发者以较低的成本存储、管理和分析大量的数据集。它采用了列式存储和并行计算技术,允许大规模的数据仓库查询和操作。Amazon Redshift适用于数据仓库和...
【标题】:“Amazon:创建亚马逊”意味着我们将探讨如何在Amazon Web Services (AWS) 上搭建一个基本的在线商店或服务。AWS 提供了多种云服务,包括计算、存储、数据库、分析、机器学习等,使开发者能够快速构建和...
7. Motivations:使用 Word2vec 模型的动机来自于 Amazon Reviews 和用户浏览历史记录的分析,旨在实现个性化推荐系统。 8. META MODEL:使用 Word2vec 模型生成的词表示可以应用于多种领域,例如主题模型、情感分析...
助手服务可使用亚马逊收据验证服务(RVS)来验证应用内购买。 安装 $ npm install amazon_iap 用法 您可以在有关该过程的Amazon文档。 配置并运行服务后,可以浏览该服务: var that = this; var options = { ...