Web services avec SOAP::Lite

 

 

Exemple de web service permettant de controler l'orthographe d'un texte (issu d'un article récent de DDJ) :


#!/usr/local/bin/perl -w
use SOAP::Transport::HTTP;
my $daemon = SOAP::Transport::HTTP::Daemon
    -> new (LocalAddr => 'localhost', LocalPort => 81)
    -> objects_by_reference(qw(Spelling))
    -> dispatch_to('Spelling');
print "Contact to SOAP server at ", $daemon->url, "\n";
$daemon->handle;
package Spelling;
sub check
{
    my ($self, $text) = @_;
    use Lingua::Ispell;
    $Lingua::Ispell::path = "/usr/bin/ispell";
    $dummy = '__TERM__';
    for $word (Lingua::Ispell::spellcheck ($text))
    {
        if ($word->{type} eq 'miss')
        {
           
	   # First replace any terms found inside HTML or Embperl
	   # brackets with dummy term
           
           $text =~ s{([\<\[])([^\>\]]*?)(\b$word->{term}\b)}{$1$2$dummy}g;
 
           # Now mark up the remaining terms with red font
           $text =~ s{(^|[^\>\&])(\b$word->{term}\b)}{$1\<FONT COLOR=\"red\"\>$2\<\/FONT\>}g;
           # Restore the dummy terms
           $text =~ s{$dummy}{$word->{term}}g;
        }
    }
    return $text;
}
1;
Le client SOAP :
 
sub check_spelling
{
        my ($self, $textref) = @_;
 
        # Check spelling
        use SOAP::Lite;
        my $soap = SOAP::Lite
           -> uri('http://localhost/Spelling')
           -> proxy('http://localhost:81')
           -> on_fault
(sub {undef $result});
        $result = $soap->check($$textref);
        $$textref = $result ? $result->result()
: $$textref;
}
 
Client permettant d'interroger le web service de Google :
 
#!/usr/bin/perl -w

# GoogleSearch.pl
# 11apr2002 - matt@interconnected.org http://interconnected.org/home/
# Demonstrates use of the doGoogleSearch method on the Google API.
# See http://www.google.com/apis/ to get your key and download the WSDL
#(which this script expects to find in its directory).

use strict;
use SOAP::Lite;

# Configuration
my $key   = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; # <-- PUT YOUR KEY HERE
my $query = $ARGV[0] || "google api"; # either type on the command line,
                                      # or it defaults to 'google api'

# Redefine how the default deserializer handles booleans.
# Workaround because the 1999 schema implementation incorrectly doesn't
# accept "true" and "false" for boolean values.
# See http://groups.yahoo.com/group/soaplite/message/895
*SOAP::XMLSchema1999::Deserializer::as_boolean =
    *SOAP::XMLSchemaSOAP1_1::Deserializer::as_boolean = 
    \&SOAP::XMLSchema2001::Deserializer::as_boolean;

# Initialise with local SOAP::Lite file
my $service = SOAP::Lite
    -> service('file:./GoogleSearch.wsdl');

my $result = $service
    -> doGoogleSearch(
                      $key,                               # key
                      $query,                             # search query
                      0,                                  # start results
                      10,                                  # max results
                      "false",                            # filter: boolean
                      "",                                 # restrict (string)
                      "false",                            # safeSearch: boolean
                      "",                                 # lr
                      "latin1",                           # ie
                      "latin1"                            # oe
                      );

# $result is hash of the return structure. Each result is an element in the
# array keyed by 'resultElements'. See the WSDL for more details. 
if(defined($result->{resultElements})) {

    my @results = @$result->{resultElements};
    my $res;
    foreach $res (@results) {
      print join "\n",
      "Found:",
      $res->{title},
      $res->{URL} . "\n"
    }
}



# nb:
# - The two booleans in the search above must be "false" or "true" (not 1 or
#   0). Previously this script used 'SOAP::Data->type(boolean => "false")'
#   which came out as '0' in the SOAP message, but wasn't understood by the
#   Google interface.
# - I understand that the Schema definition workaround above isn't needed if
#   you're using SOAP::Lite 0.52 or above. I've been using 0.51.
Ressources: