アマゾン書籍DB検索をAjaxでやってみた

February 26, 2009 – 7:14 pm

5日ほど前に「Ajaxの基本XMLHttpRequestを試してみた」と題する記事を書いた。ここでAjaxの基本的な仕組みをおぼろげながら理解したように感じる。そこで、昨年末に作成したアマゾンAPIを用いた蔵書管理システム用のphp関数の一部を使った簡単な検索ツールを、このブログ上で、Ajaxの枠組みで動かしてみことにした。ここで作った検索ツール、ISBNを入力すると、該当する書籍データを出力する極めて簡単なものだ。

ISBNから書籍データを検索してみよう: 何はともあれ、実際に、今回作ってみた検索ツールを動かしてみてほしい。下のインプットフィールドに適当な書籍のISBN値を(半角で)入力し、[Search]ボタンをクリックして欲しい。該当する書籍のイメージとタイトル、著者などの書籍情報が出力されるはずだ(例えば、ISBN値として、4334751067 を入力してみよう)。



入力したISBN値がアマゾン書籍データベースにないと、その旨出力されるはずだ。試してみて欲しい。

JavaScriptの組み込みとフォームの作成: うえに示した書籍検索用ツールを実現するため書いたHTML文を示すと以下のものだ;

<script type="text/javascript" src="/scripts/amazon_ajax.js">
</script>

<form name="F1">
<input type="text" name="T1">
<input type="button" value="click" onclick="getBookByCode()">
</form>

<div id="Amazon_Area"></div>
        

まず、一行目、この書籍検索用ツールを動作させるために作成したJavaScriptファイルamazon_ajax.js(前回と同様、ドキュメントツール直下の/scriptsに配置している)を定義している。

二行目以降に書かれているのが、ISBN値の入力用フォームと検索ボタン、そして検索結果を出力するエリアを定義しているHTML文だ。検索ボタンの部分のonclick=”getBookByCode();”というかたちで、ボタンのクリック操作によるボタンイベントの発生によりamazon_ajax.js内に定義されている関数getBookByCode()が実行される。

JavaScriptファイルamazon_ajax.jsは次のようなものである;

function GetXmlHttpObject()
{var xmlHttp=null;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
return xmlHttp;
}

function stateChanged()
{
if (xmlHttp.readyState==4)
{
document.getElementById("Amazon_Area").innerHTML=xmlHttp.responseText;
}
}

function getBookByCode() {
var isbn = document.F1.T1.value;
xmlHttp=GetXmlHttpObject();
if (xmlHttp==null) {
    alert("Your browser does not support AJAX!");
    return;
}
var url="/scripts/Sample_ajax.php";
url = url+"?code=ISBN&no="+isbn;
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
        

ここで示したJavaScriptファイルの構成は、以前の記事「Ajaxの基本XMLHttpRequestを試してみた」と、サーバーサイドで動作するSample_ajax.phpにISBN値を受け渡すためのクエリーを付け加えたところを除くと、基本的には変りはない。前回とは関数という形で機能的に分割したところが違いといえば違いだろう。個々の関数の役割については、前回の記事を参照して欲しい。

サーバーサイドで実行されるSample_ajax.phpのソースは、下記のようなものである:

<?php
      header("Cache-Control: no-cache, must-revalidate");
      require_once('SetBookByAmazon.php');
      $ISBN     = $_GET["no"];       $BookCode = $_GET["code"];
      $return = SetBookByAmazon($ISBN, $BookCode);
      $book   = $return[0];       $author_array = $return[1];
      if ( !$book->getIsbn() ) {          echo " No book found for ISBN =" . $ISBN . " in Amazon DB <br></br>";          $book = NULL;          $author_array=NULL;          return;       }       $blank = " ";       echo "<table width=500 height=170 border=0>";       echo "<tr>";       echo "<td width=110><img src='" . $book->getImage_url() . "'></td>";       echo "<td width=5>" . $blank . "</td>";       echo "<td>";       echo "<strong>" . $book->getTitle() . "</strong><br>";       echo $blank;       for ($i=0; $i<sizeof($author_array); $i++) {        if ( !$author_array[$i]->getRole() ) $role = "著";        else                                 $role = $author_array[$i]->getRole();        echo $author_array[$i]->getAuthor() . "(" . $role;        if ( $i !== sizeof($author_array)-1 ) echo "),";        else                               echo ")<br>";       }       echo $blank . $book->getPublisher() . "(" . $book->getPubdate() . ")<br>";       echo $blank . $book->getBinding() . "(" . $book->getPages() . "p.)<br>";       echo $blank . $book->getPrice() . "円<br>";       echo "</td>";       echo "</tr></table>";       $book = NULL;       $author_array=NULL; ?>

1行目のheader(・・・・)部分で、キャッシュを無効にしphpファイルがコールされるたびに新たな値を計算する。

require_once(‘SetBookByAmazon.php’);では、以前、アマゾンAPIを用いるために作成した関数SetBookByAmazon()を用いることを示している。このソースは、以前とは一部変更した部分があるので、このブログの巻末に参考情報として掲げている。

$_GET[“no”]、$_GET[“code”]で、クエリー情報としてわたされたISBN値を取得する。これのISBN値を用いて、書籍の検索はSetBookByAmazon()で行われる。

参考にしたサイトw3schools.com

 
=====<<< 参考 >>>==== SetBookByAmazon.php ソース

下記のソースは、以前の「アマゾンAPIを活用した蔵書管理システム(2)」に示したSetBookByBookId.phpを一部修正したものである。使用方法など詳細については、このエントリーを参照して欲しい。

<?php
function SetBookByAmazon($BookId,$BookCode ){
    require_once("./Book.php");
    require_once("./Author.php");
    define('KEYID',' ---- ');
    define('AssocTag',' ---- ');
    $request='http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService'
 . '&AWSAccessKeyId='.KEYID.'&AssociateTag='.AssocTag.'&Operation=ItemLookup'
 . '&ResponseGroup=Large&IdType=ASIN&Version=2008-08-19'
 . '&ItemId=';
    $request    = $request . '&IdType=' . $BookCode . '&ItemId=' . $BookId;
    $response   = file_get_contents($request);
    $parsed_xml = simplexml_load_string($response);
// Get AWS 判定
    $IsValid    = $parsed_xml->Items->Request->IsValid;
    if( $IsValid != 'True' ) return -1;
//
    $Item       = $parsed_xml->Items->Item;
// Get Image URL
    $Image_URL  = $Item->MediumImage->URL;
// Get ASIN
    $ASIN       = $Item->ASIN;
// Get Book_Data
    $Attributes = $Item->ItemAttributes;
       $Binding      = $Attributes->Binding;
       $EAN          = $Attributes->EAN;
       $ISBN         = $Attributes->ISBN;
       $Pub_Date     = $Attributes->PublicationDate;
       $Price        = $Attributes->ListPrice->Amount;
       $Currency_cd  = $Attributes->ListPrice->CurrencyCode;
       $Publisher    = $Attributes->Publisher;
       $Title        = $Attributes->Title;
       $Pages        = $Attributes->NumberOfPages;

       if      ( strlen($Pub_Date) == 7 ) $Pub_Date=$Pub_Date . '-00';
       else if ( strlen($Pub_Date) == 4 ) $Pub_Date=$Pub_Date . '-00-00';
       else if ( strlen($Pub_Date) < 4  ) $Pub_Date='0000-00-00';

       $book = new Book();
       $book->setIsbn($ISBN);
       $book->setAsin($ASIN);
       $book->setEan($EAN);
       $book->setTitle($Title);
       $book->setImage_url($Image_URL);
       $book->setPubdate($Pub_Date);
       $book->setPrice($Price);
       $book->setPages($Pages);
       $book->setPublisher($Publisher);
       $book->setBinding($Binding);
       $book->setCurrency_cd($Currency_cd);
       $book->setPosition($BookId);

    $author_name = array();
    $ncr = 0;
    foreach( $Attributes->Author as $Author_name ) {
       $author_name[$ncr] = $Author_name;
     //   echo "author = " . $author . "\n";
       $ncr = $ncr + 1;
    }
    foreach( $Attributes->Creator as $Creator ) {
       $author_name[$ncr] = $Creator;
       $ncr = $ncr + 1;
    }

    $author_array = array();
    for ( $i=0; $i<sizeof($author_name); $i++ ) {
//       echo  'Author  : ' . $author_name[$i] . '[' . $author_name[$i]['Role'] . "] \n";

       $author = new Author();
       $author->setAuthor($author_name[$i]);
       $author->setRole($author_name[$i]['Role']);
       $author_array[] = $author;
    }

    $return_arguments = array();
       $return_arguments[] = $book;
       $return_arguments[] = $author_array;

    return $return_arguments;

}
?>
        


  1. 1 Trackback(s)

  2. Aug 15, 2009: 電子署名添付のAmazon APIを用いた書籍検索ツール | Yama's Memorandum

Post a Comment