** 摘要 ** ** **
Amazon 免费的 Web Services 可以让你在自己编写的应用程序中查询并显示 Amazon 站点上的数据,接下来我们就进入雅玛逊,用 .NET 去体会 Web Services 。
** 目录 ** ** **
1. Amazon Web Services 简介
2. 使用 .NET 体验 Amazon Web Services
3. 小结
** 1. ** ** ** ** Amazon Web Services ** ** 简介 ** ** **
几年前 Amazon 就发布了能够查询和显示自己产品信息的 Web Services ,这个 Web services 兼容几乎所有的能够借助 HTTP 并消费 HTML 或基于 SOAP 的 XML 的语言。
在使用 Amazon Web Services 之前,需要到 Amazon 下载开发包,这个开发包包含开发人员需要的文档资料以及代码样例( http://www.amazon.com/gp/browse.html/ref=sc_fe_c_3/103-9196653-9063038?no=3435361&me=A36L942TSJ2AJA&node=3434641 )
之后需要得到 Amazon 开发者的证件( https://associates.amazon.com/exec/panama/associates/join/developer/application.html )
** 2. ** ** 使用 ** ** .NET ** ** 体验 ** ** Amazon Web Services **
有两种方法可以查询 Amazon Web Service :使用 HTTP 请求或者借助 SOAP ,下面就用强大的 .NET 来完成这次雅玛逊之旅。
首先,我们需要建立一个简单的应用程序,它必须要有一个文本框作为查询使用,用户在输入了关键字后程序便调用 Amazon 的服务按照输入的关键字查询,然后将找到的相关产品标题输出到列表框中,最后当用户点击了列表中的相应标题时显示明细到另一个多行文本框中。
完成以上的步骤,我们需要发送两种请求: KeywordRequest 和 AsinRequest 。 ASIN 是“ Amazon.com 标准产品序号”的简称,它唯一的标示了每一件 Amazon 的产品。请求又分为两种类型:轻量级和重量级,本应用中, KeywordRequest 为轻量级请求,而 AsinRequest 是重量级的请求。这是由请求返回的数据量决定的。
① 创建 .NET Windows 应用,并在窗口中加入下列控件
txtSearch— 单行文本框,允许用户输入关键字进行商品店的查询
lstResults— 列表框,显示根据关键字得到的标题
txtDetails— 多行文本框,显示标题对应的商品明细
② 引入 Amazon Web Service
在 .NET IDE 的“ Project ”主菜单中选择“ Add Web Reference… ”菜单项,并在弹出对话框的地址栏中输入“ http://soap.amazon.com/schemas2/AmazonWebServices.wsdl ”后回车。
① 调用 Amazon Web Service
引入 Web Service 成功后,编写代码将 Amazon Web Service 的名称空间引入
[C#]
using AmazonWebServices.com.amazon.soap;
[VB.NET]
Imports AmazonWebServices.com.amazon.soap
要实现 SOAP 查询,首先需要创建一个 AmazonSearchService 类的实例
[VB.NET]
Dim srch As New AmazonSearchService()
每次关键字查询都会需要创建 KeywordRequest 实例;每次 ASIN 查询就需要创建一个 AsinRequest 对象。每次的请求也会返回一个 ProductInfo 的 XML 文档节点, 所以也必须创建一个 ProductInfo 实例从响应中检索 ProductInfo 的数据。
[VB.NET]
Dim kr As New KeywordRequest()
kr.devtag = " 你得到的 Amazon 开发者的证件 "
kr.keyword = txtSearch.Text
kr.mode = "books"
kr.sort = "+titlerank"
kr.tag = "webservices-20"
kr.type = "lite"
kr.page = "1"
Dim pi As ProductInfo = srch.KeywordSearchRequest(kr)
Dim allDetails() As Details = pi.Details
请求发出之前需要将我们之前得到的 Amazon 开发者证件的数值付给 KeywordRequest 对象的 devtag 属性,而结果会按照标题字母的升序排列。每次查询最多会返回 10 条数据,因此想要得到更多的数据必须进行多次查询。
[VB.NET]
If (pi.TotalResults > 10) Then
kr.page = "2"
pi = srch.KeywordSearchRequest(kr)
allDetails = pi.Details
End If
② 显示查询结果
[VB.NET]
Me.Cursor = Cursors.WaitCursor
Dim i As Int16
For i = 0 To allDetails.Length - 1
lstResults.Items.Add(" 产品名称: " & allDetails(i).ProductName & " || 产品序号: " & allDetails(i).Asin)
Next
Me.Cursor = Cursors.Default
③ 显示明细
使用 ListBox 的 SelectedIndexChanged 事件检索 ASIN (产品序号)请求的数据。
[VB.NET]
Dim ar As New AsinRequest()
ar.asin = Microsoft.VisualBasic.Right(CStr(lstResults.Items(lstResults.SelectedIndex)), Len(CStr(lstResults.Items(lstResults.SelectedIndex))) - (InStr(1, CStr(lstResults.Items(lstResults.SelectedIndex)), "|| 产品序号: ") + Len("|| 产品序号: ")) + 1)
ar.devtag = " 你得到的 Amazon 开发者的证件 "
ar.type = "heavy"
ar.tag = "webservices-20"
Dim srch As New AmazonSearchService()
Dim pi As ProductInfo = srch.AsinSearchRequest(ar)
Dim allDetails() As Details = pi.Details
txtDetails.Text = " 产品名称: " & allDetails(0).ProductName & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 产品序号: " & allDetails(0).Asin & System.Environment.NewLine
Dim strAuthors() As String = allDetails(0).Authors
If strAuthors.Length > 0 Then
Dim j As Int16
For j = 0 To strAuthors.Length - 1
txtDetails.Text = txtDetails.Text & " 作者: " & strAuthors(j) & System.Environment.NewLine
Next
End If
txtDetails.Text = txtDetails.Text & " 分类: " & allDetails(0).Catalog & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 出版商: " & allDetails(0). Publisher & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 数量: " & allDetails(0).CollectibleCount & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 价格: " & allDetails(0).CollectiblePrice & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 小图片 URL : " & allDetails(0).ImageUrlSmall & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 中图片 URL : " & allDetails(0).ImageUrlMedium & System.Environment.NewLine
txtDetails.Text = txtDetails.Text & " 大图片 URL : " & allDetails(0).ImageUrlLarge & System.Environment.NewLine
④ 显示 URL 指向的图片
从上面代码的最后几行可以看到每个产品是含有图片的,我们可以自己编写一个 ImageFromAmazon 方法用来显示 Amazon 网站上面的图片信息。
Private Function ImageFromAmazon(ByVal url As String) As Image
Dim wc As New WebClient()
Dim st As System.IO.Stream = wc.OpenRead(url)
Dim img As Image = Image.FromStream(st)
st.Close()
Return img
End Function
ImageFromAmazon 方法创建 WebClient 实例并从指定的 URL 请求图片数据分配给 Stream 对象,方法的返回值是 Image 类型,这种类型可以直接赋值给 PictureBox 的 Image 属性。那么在现有的窗体上面加入 PictureBox</SPA