UML软件工程组织

用VB.net构建Amazon Web服务应用程序
作者:王凯明 本文选自:赛迪网 2003年04月14日

 


一.前言:

  Web服务是微软提出的基于互联网的开发模型,一经提出即收到了业界的广泛推从。从目前的发展趋势来看,Web服务将引领下一代互联网的潮流。它是创建可互操作的分布式应用程序的新平台,是基于网络的、分布式的模块化组件。它执行特定的任务,遵守具体的技术规范,这些规范使得Web服务能与其他兼容的组件进行互操作。

  本文通过运用VB.net创建一个十分有用的Amazon网络书店的Web服务应用程序来向大家展示Web服务的魅力。Amazon在前几个月公布了它的Web服务体系,到目前为止已经是第二版了。如果读者了解或是应用过Google的Web服务的话,那么Amazon的Web服务就不会令你感到陌生了。两家公司的Web服务都需要开发者下载它们的开发者工具箱(Developer's Kit)和免费的开发者令牌(Developer's Token),而且两家公司都没有对它们的Web服务进行收费的计划,所以要是你对Web服务很感兴趣的话,还不赶快来试着开发一个属于自己的Web服务应用程序。

  在正式进行开发之前,我先向大家介绍一下Amazon的Web服务推出的必要性。Amazon是一家著名的网络书店,它在出版商和读者之间架起了一座商品交易的桥梁。出版商对于自己在Amazon上的销售情况是非常关注的,在Amazon的Web服务推出以前,每个出版商都得建立自己在Amazon上的销售情况的数据库,并从其网页上获取相关信息并存入数据库中,进而进行相应的管理。不过,在Amazon推出了其Web服务之后,各个出版商只需应用该Web服务就可以很容易的产生销售和管理报告。所以,Web服务的推出大大简化了出版商的相关工作。同时,对于用户而言,这当然也是一个喜讯,用户可以在自己程序中调用Web服务以完成相关的查询和定购工作。因此,Amazon Web服务的推出将使得出版商和读者之间的桥梁变得更宽阔。

  二.开发步骤:

  下面我们就开始具体的开发工作。首先,你得到http://www.amazon.com/webservices下载Amazon的开发者工具箱,并从它们的网站获取开发其Web服务所需的开发者令牌(通过该令牌,你便可以访问它们的Web服务)。一旦完成了以上工作,我们就可以开始真正的开发了。

  在本程序中,我们将开发一个应用Web服务的基于Windows Form的程序,开发的工具为VB.net。通过该程序,我们可以通过书籍的名称来搜索其相关信息,包括:作者、价格、Amazon的打折价、用户的评价以及书籍的封面等信息,以下是具体的开发步骤。

  第一步,打开VS.net,新建一个VB.net的项目,在项目类型中选择"Visual Basic项目",在模板中选择"Windows应用程序",同时不妨命名为"AmazonWebService",图示如下:



  图1

  第二步,添加Web引用。如果你是在用VS.net进行开发的话,通常情况下,你只要添加一个描述所需要的Web服务的WSDL(以asmx为扩展名的文件)的相应URL即可,比如:http://www.abc.com/abc.asmx。不过Amazon的Web服务有点例外,它没有相应的URL可以让你引用,它的WSDL文档包含在其开发者工具箱中,所以你需要用WSDL.exe这个工具来手动完成相关工作,方法如下:

  C:\>wsdl /language:vb /o:Amazon.vb AmazonWebServices.wsdl


  上面的代码为你的VB.net创建了一个代理类,要在你的项目中运用它,你只需要将Amazon.vb这个文件添加到你的项目中即可。图示如下:



  图2

  同时,因为我们创建的项目是一个Windows应用程序,所以我们还得添加两个引用:System.Web和System.Web.Services。

  第三步,设计程序的主界面。你可以按照如下方式设计程序的主界面:



  图3

  由于我们在程序中要显示书籍的封面信息,所以我们在程序中使用了Web Browser控件。通过它,我们就可以方便的显示图像。运用该控件的另一个原因是当我们调用其Web服务之后,系统返回给我们的信息中包含的并不是一幅二进制格式的图片,而是该图片的URL,所以运用Web Browser控件可以很容易做到这一点。你可以通过以下方法添加该控件到窗体上:在VS.net的工具箱中选择"自定义工具箱"选项,在弹出的对话框中选定"Microsoft Web 浏览器"复选框,点击"确定"按钮即可,图示如下:



  图4

  第四步,编写程序代码。我们通过点击"开始搜索!"按钮调用Web服务,其消息响应函数为:Private Sub cmdSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSearch.Click,下面我们开始分析具体的代码。

  首先,我们得建立一个Amazon.vb文件中的代理类的实例对象:

Dim ws As New AmazonSearchService()


  接下来,如果你是在一个局域网环境中并通过代理服务器连接Internet的话,你得创建一个代理服务器对象。这一步很重要,关系到你能否正确调用Web服务。如果没有设置或是设置错误的话,程序将会报告错误。其实现方法如下:

Dim myProxy As New System.Net.WebProxy("yourproxy..company.com", 8080)
ws.Proxy = myProxy


  下面,我们开始我们的"关键字搜索"的搜索方法(不过还有其它的搜索方法,有兴趣的读者不妨参考其开发者工具箱以获得更多信息)。我们通过使用KeywordRequest类的实例对象完成我们的Web服务调用请求。在该类中,我们要设置很多属性,方法如下。同时请注意,目前这些属性的默认值还未被支持,也就是说如果你设置了空值的话系统将返回一个代码为的"404"错误。

Dim keywordReq As New KeywordRequest()

keywordReq.keyword = txtKeyword.Text
keywordReq.type = "heavy" 
   ' 预期的搜索结果类型
keywordReq.devtag = "XXXXX" 
   ' 输入你的开发者令牌号
keywordReq.version = "1.0"  
   ' 当前版本号
keywordReq.mode = "books"   
   ' 产品分类,如:书籍、CD、DVD等
keywordReq.tag = "webservices-20" 
   ' 你的Amazon的会员ID
keywordReq.page = 1         
   ' 如果搜索的结果很多的话,需要对其进行分页处理,这里获取的为第一页
所有的属性被设置好后,我们就调用Web服务,其返回的结果是一个ProductInfo类的对象
(我们在程序中将该对象设置为一个全局变量),相应的代码如下:
Try
    productsInfo = ws.KeywordSearchRequest(keywordReq)
Catch err As Exception
    MsgBox("Error accessing Amazon.com's Web service. Please try again")
    Return
End Try


  返回的结果将一个一个地添加在窗体的列表框中,通过点击列表框中的项,我们可以获取相应项的信息,包括:标题、作者、价格、Amazon的打折价、用户的评价以及书籍的封面等信息。其实现的代码如下:

lstTitles.Items.Clear()
Dim i As Integer
For i = 0 To productsInfo.Details.Length - 1
    lstTitles.Items.Add(productsInfo.Details(i).ProductName.ToString)
Next


  这样,我们实现了基本的Web服务调用功能,下面处理前面提到的列表框控件的用户事件处理方法,通过选择其中的项,我们让程序显示相应项的详细信息,代码如下:

Private Sub lstTitles_SelectedIndexChanged(ByVal sender As System.Object, 
ByVal e As System.EventArgs) Handles lstTitles.SelectedIndexChanged
        ' 显示标题等信息
        lblTitle.Text = productsInfo.Details(lstTitles.SelectedIndex).ProductName
        lblListPrice.Text = productsInfo.Details(lstTitles.SelectedIndex).ListPrice
        lblAmazonPrice.Text = productsInfo.Details(lstTitles.SelectedIndex).OurPrice

        ' 显示书籍所有的作者
        Dim i As Integer
        lblAuthors.Text = ""
        For i = 0 To productsInfo.Details(lstTitles.SelectedIndex).Authors.Length - 1
            lblAuthors.Text += productsInfo.Details(lstTitles.SelectedIndex).Authors(i).ToString
            If i <> productsInfo.Details(lstTitles.SelectedIndex).Authors.Length - 1 Then  
    ' not the last author
                lblAuthors.Text += ", "
            End If
        Next

        ' 显示用户的评价信息
        If Not productsInfo.Details(lstTitles.SelectedIndex).Reviews Is Nothing Then
            lblRating.Text = ""
            For i = 1 To productsInfo.Details(lstTitles.SelectedIndex).Reviews.AvgCustomerRating
                lblRating.Text += "*"
            Next
        End If

        ' 根据"图片大小"中的选定显示图片
        If optSmall.Checked Then
            AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlSmall)
        ElseIf optMedium.Checked Then
            AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlMedium)
        Else
            AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlLarge)
        End If
End Sub


  程序的最后便是完成"图片大小"中的用户事件处理方法的三个函数:

Private Sub optSmall_CheckedChanged(ByVal sender As System.Object,
 ByVal e As System.EventArgs) Handles optSmall.CheckedChanged
        If productsInfo Is Nothing Then Return
        AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlSmall)
    End Sub

    Private Sub optMedium_CheckedChanged(ByVal sender As System.Object,
 ByVal e As System.EventArgs) Handles optMedium.CheckedChanged
        If productsInfo Is Nothing Then Return
        AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlMedium)
    End Sub

    Private Sub optLarge_CheckedChanged(ByVal sender As System.Object,
 ByVal e As System.EventArgs) Handles optLarge.CheckedChanged
        If productsInfo Is Nothing Then Return
        AxWebBrowser1.Navigate(productsInfo.Details(lstTitles.SelectedIndex).ImageUrlLarge)
End Sub


  第五步:运行程序。程序的运行结果图示如下:



  图5



  三.总结:

  最后要指出的是,我们在本程序中仅仅用了Amazon提供的以SOAP消息的方式调用其Web服务,其实你还可以通过XML/HTTP的方式来调用其Web服务,有兴趣的读者不妨去一下它提供的开发者工具箱,其中有详细的说明和文档。同时我在文章中没有涉及到更高级的话题,比如应用Amazon的XSLT服务等,有兴趣的读者也可试着去了解一些。通过本文,我想读者对于开发Amazon的Web服务应用程序一定有了相应的了解,至于开发其他的Web服务,我想那也是可以触类旁通的吧。最后,希望本文能对每位读者有一定帮助!

(责任编辑 西门吹雪

  




版权所有:UML软件工程组织