商品数とページ数

広告

例えば「Title」プロパティに値を指定して検索した結果、該当する商品数が常に1つとは限りません。複数の商品が一致する場合は、一致する商品の情報を結果として返してきます。

例としてSearchIndexプロパティに「Books」、Authorプロパティに「伊坂幸太郎」を指定してリクエストを送信してみます。

http://ecs.amazonaws.jp/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=[AccessKey]
&Version=2009-07-01
&Operation=ItemSearch
&SearchIndex=Books
&Author=伊坂幸太郎
&ResponseGroup=Small

※必要に応じてURLエンコードして下さい。

上記のようなリクエストを送信した場合に取得できる情報は次の通りです。

<?xml version="1.0" ?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-07-01">
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" />
    </HTTPHeaders>
    <RequestId>ea884896-1fdd-48b8-9723-8d767e96d398</RequestId>
    <Arguments>
      <Argument Name="Operation" Value="ItemSearch" />
      <Argument Name="Service" Value="AWSECommerceService" />
      <Argument Name="Author" Value="伊坂幸太郎" />
      <Argument Name="AWSAccessKeyId" Value="(key)" />
      <Argument Name="Timestamp" Value="2009-07-24T23:34:54.000Z" />
      <Argument Name="Signature" Value="bqvi9iYWMtJrncE41JVbkIUxBx0YU3TpEllVtqiEYrI=" />
      <Argument Name="ResponseGroup" Value="Small" />
      <Argument Name="SearchIndex" Value="Books" />
      <Argument Name="Version" Value="2009-07-01" />
    </Arguments>
    <RequestProcessingTime>0.2331470000000000</RequestProcessingTime>
  </OperationRequest>
  <Items>
    <Request>
      <IsValid>True</IsValid>
      <ItemSearchRequest>
        <Author>伊坂幸太郎</Author>
        <Condition>New</Condition>
        <DeliveryMethod>Ship</DeliveryMethod>
        <MerchantId>Amazon</MerchantId>
        <ResponseGroup>Small</ResponseGroup>
        <ReviewSort>-SubmissionDate</ReviewSort>
        <SearchIndex>Books</SearchIndex>
      </ItemSearchRequest>
    </Request>
    <TotalResults>50</TotalResults>
    <TotalPages>5</TotalPages>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  + <Item>
    </Item>
  </Items>
</ItemSearchResponse>

※Item要素の中身は省略しています。

返されてきたデータの中に次のような要素があります。

<TotalResults>50</TotalResults>
<TotalPages>5</TotalPages>

「TotalResults」要素に含まれるデータが検索した条件に一致した商品数となります。今回の場合は「50」個の商品が検索結果として一致したことを表しています。

一つ一つの商品の情報は「Item」要素の中に含まれていますが一度のリクエストに対して返すことができる商品の最大数は10となっています。よって先ほどの結果にはItem要素が10個含まれています。

一度に返すことができる商品数が10のため、ページという概念を使って10以上の商品情報を取得できるようになっています。1ページ目にはリクエストに一致した1から10の商品情報が含まれ、2ページ目にはリクエストに一致した11から20の商品情報が含まれます。このようにページ数を合わせて指定することで10個以上の商品が一致した場合でも順に情報を取得することができます。

先ほどの例では「TotalResults」要素が50となっていましたので必要なページ数は50÷10=5となります。この値が「TotalPages」要素の値として設定されています。

なおオペレーションとしてItemSearchを使用する場合、ページ数の最大数は400ページとなっています。つまり400×10=4000個以上の検索結果が返されるようなリクエストを送信し、401ページ目のデータを参照しようとするとエラーとなります。このような場合はより条件を絞ったリクエストを作成する必要があります。

サンプルプログラム

それでは簡単なXSLTファイルを作成して検索した結果から商品データと商品総数及びページ総数をHTMLページとして表示してみます。(XSLTの詳しい説明は「XSLTを使ったHTML変換」を参照して下さい)。

使用したXSLTファイルは次の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2009-07-01"
  version="1.0">
<xsl:output method="html" encoding="UTF-8"/>

<xsl:template match="/">
  <html lang="ja">
  <head>
  <title>XSLサンプル</title>
  </head>
  <body>

  <xsl:apply-templates select="aws:ItemSearchResponse/aws:Items" />

  </body>
  </html>
</xsl:template>

<xsl:template match="aws:ItemSearchResponse/aws:Items">
  <xsl:apply-templates select="aws:Item" />

  <p>
  [商品総数]<xsl:value-of select="aws:TotalResults" />
  [ページ総数]<xsl:value-of select="aws:TotalPages" />
  </p>
</xsl:template> 

<xsl:template match="aws:Item">
  <p>
  [タイトル]<xsl:value-of select="aws:ItemAttributes/aws:Title" />
  </p>
</xsl:template> 

</xsl:stylesheet>

結果は次のようになります。

商品数とページ数

( Written by Tatsuo Ikura )