亚玛逊网站 (Amazon.com) 正在为它庞大数据库提供一个Web服务的API。在这篇文章里,我们会粗略的研究一下这个API并有一个简单的应用,这个应用一个特殊的关键字在数据库中搜索相应的书籍。
第一步就是让你的电脑得到亚玛逊网站的Web 服务。为了得到这个API,你要下载Amazon SDK,它里面包括了示例代码和分别以HTML、Word、和PDF格式书写的API文档。
在下载完SDK之后,你必须登记获得一个开发者授权。填写完必要的表格后将授权保存起来以便日后使用。
因为几乎所有的例子都是用Java编写的,我们将另取其道——在.net环境下通过Windows 窗体编写一个简单的应用例子。但是,在我们开始之前,需要建立一个代理类(proxy class)作为雅玛逊网站Web服务的接口。
首先,我们要取得Web服务的WDSL描述文件。下载并在硬盘上保存这个文件。启动Visual Studio 命令提示符方式,得到保存在硬盘上的路径,然后输入下面的命令:
wsdl /l:vb /o:AmazonProxy.vb AmazonWebServices.wsdl
这个指令会产生应用程序需要的调用Web服务代理类。
启动VS.NET并建立一个新的Windows应用。然后,将上面建立的代理类复制到应用程序所在的文件夹中并且添加到项目中。打开这个代理类而且要注意方法的多样性和它所暴露的其它类。
我们的目的是建立一个包含一个文本框、列表框和三个按钮的窗体,它可以对亚玛逊网站图书数据库执行关键词搜索。把这三个控件托拽到窗体中并根据的想法组织布局。
将 Listing A 中的代码加入到搜索按钮的单击事件中:
Listing A
Private Sub btnSearch_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnSearch.Click
If Me.txtSearch.Text = ""
Then
MsgBox("Enter
a keyword")
Else
' Switch
to the hourglass during processing
Me.Cursor.Current
= Cursors.WaitCursor
Dim
AmazonProxy As New AmazonSearchService()
Dim
KeywordReq As New KeywordRequest()
Dim
ResultsInfo As ProductInfo
' Set
the keyword property to the textbox text property
KeywordReq.keyword
= Me.txtSearch.Text
' type
of result expected, lite or heavy
KeywordReq.type
= "heavy"
' the
token assigned to you
KeywordReq.devtag
= DEV_TOKEN
' product
category
KeywordReq.mode
= "books"
' Specify
which page to return
KeywordReq.page
= PageNum
Try
'
Execute the webmethod to perform the search
ResultsInfo
= AmazonProxy.KeywordSearchRequest(KeywordReq)
Catch
err As Exception
MsgBox("Error
accessing Amazon.com's Web service. Please try "
+
"again")
Me.Cursor.Current
= Cursors.Default
Return
End
Try
' If
no results were found, msgbox the user
If ResultsInfo.Details.Length
= 0 Then
MsgBox("No
results found")
Else
' Clear our listbox
and populate it with the results of the webmethod
lstTitles.Items.Clear()
Dim
i As Integer
For
i = 0 To ResultsInfo.Details.Length - 1
lstTitles.Items.Add(ResultsInfo.Details(i).ProductName.ToString)
Next
End
If
' Reset
the cursor
Me.Cursor.Current
= Cursors.Default
End If
End Sub
这段代码用来检测是否将有效的值输入到文本框中。假如一个搜索字符串已经输入,鼠标指针变成沙漏来说明程序正在进行。接下来,举例说明这个代理类和由名为KeywordRequest和 ProductInfo而产生的两个类。
现在来通过一些值来设定KeywordRequest以便执行一个有效的搜索。显而易见,将我们已开始是保存的开发者权限(developer token)放到名为DEV_CODE的字符串中,日后用起来更方便。
Mode 属性告诉Web服务只能在书籍类中进行搜索。PageNum 来决定返回的结果如何分页。这个变量作为私有成员变量初始化为1。
接下来,通过 KeywordSearchRequest() 方法并将请求传递给 KeywordRequest 类的一个实例来执行Web服务。返回的结果是一个称为 ProductInfo 的类。返回的每个项目都作为独立的结果保存在Details 类中的属性数组中。
在这一点上,通过检测Details数组的长度来检测是否在ResultsInfo变量里存在结果,并且通过循环将结果显示到listbox控件中。
返回的结果一般被分为10组,为了加入分页功能,在前后翻页的按钮上加入Listing B 中的代码。
Listing B
Private Sub btnNext_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnNext.Click
PageNum += PageNum
Me.btnSearch_Click(sender, e)
End Sub
Private Sub btnBack_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnBack.Click
If Me.PageNum = 1 Then Exit Sub
PageNum -= PageNum
Me.btnSearch_Click(sender, e)
End Sub
这段代码对PageNum变量的增减取决于哪个按钮被点击,然后手工的调用搜索按钮再次搜索,但是通过不同的页码。
这个应用没有什么复杂性,但是它给开发者展示了Web服务的基本的能力和潜力。随着类似这样Web服务的API的出现,我们更多的Web服务会出现并应用起来。