Hack 88 Program AWS with SOAP::Lite and Perl

figs/expert.giffigs/hack88.gif

Use a standard Perl SOAP module to make requests and work with the responses.

Though SOAP requests and responses are more complex than those of XML/HTTP, they're just as easy to work with if you have the right tools.

88.1 What You Need

SOAP::Lite has become the standard way for Perl developers to work with SOAP services. Many ISPs have SOAP::Lite installed, but it's not yet ubiquitous. A quick request via email could save you hours of straining with the manual installation process. If you're on a Windows server, you can install it fairly painlessly with the package manager at a command prompt:

ppm install SOAP::Lite

88.2 The Code

Instead of assembling URLs, making an Amazon request with SOAP requires assembling a collection of variables and their values. Create a file called amazon.pl with the following code:

#!/usr/bin/perl
# amazon.pl
# A typical Amazon Web API Perl script that uses the SOAP::Lite Module.
# Usage: perl amazon.pl <keyword>

#Your Amazon developer's token
my $dev_token='insert developer token';

#Your Amazon affiliate code
my $af_tag='insert associate tag';

#Location of the Amazon WSDL file
my $amazon_wdsl = "http://soap.amazon.com/schemas2/AmazonWebServices.wsdl";

use strict;

#Use the SOAP::Lite Perl module
use SOAP::Lite;

#Take the query from the command-line
my $keyword =shift @ARGV or die "Usage:perl amazon.pl <keyword>\n";

#Create a new SOAP::Lite instance, feeding it Amazon's WSDL
my $amazon_search = SOAP::Lite->service("$amazon_wdsl");

#Query Amazon
my $results = $amazon_search -> 
    KeywordSearchRequest(SOAP::Data->name("KeywordSearchRequest")
        ->type("KeywordRequest")
           ->value(\SOAP::Data->value(
        SOAP::Data->name("keyword" => $keyword),
        SOAP::Data->name("page" => "1"),
        SOAP::Data->name("mode" => "books"),
        SOAP::Data->name("tag" => $af_tag),
        SOAP::Data->name("type" => "lite"),
        SOAP::Data->name("devtag" => $dev_token)
        ))
    );

foreach my $result (@{$results->{Details}}){
    #Print out the main bits of each result
    print
        $result->{ProductName}|| "no title", 
        "\nby ", 
        join (', ', @{$result->{Authors}}),
        "\n$result->{OurPrice}",
        "\nASIN: $result->{Asin}",
        "\n\n";
}

88.3 Running the Hack

Just call the script from the command line, with the keyword as an argument:

perl amazon.pl "hacks"