1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
#!/usr/bin/perl
# Example of Document SOAP.
# Same code as has_wsdl.t, but now without comments and in short notation.
# Thanks to Thomas Bayer, for providing this service
# See http://www.thomas-bayer.com/names-service/
# Author: Mark Overmeer, 27 Nov 2007
# Using: XML::Compile 0.60
# XML::Compile::SOAP 0.63
# Copyright by the Author, under the terms of Perl itself.
# Feel invited to contribute your examples!
use warnings;
use strict;
use XML::Compile::WSDL11;
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP;
# Other useful modules
use Data::Dumper; # Data::Dumper is your friend.
$Data::Dumper::Indent = 1;
use List::Util qw/first/;
my $format_list;
format =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
$format_list
.
# Forward declarations
sub get_countries();
sub get_name_info();
sub get_names_in_country();
#### MAIN
use Term::ReadLine;
my $term = Term::ReadLine->new('namesservice');
#
# Get the WSDL and Schema definitions
#
my $wsdl = XML::Compile::WSDL11->new('namesservice.wsdl');
$wsdl->importDefinitions('namesservice.xsd');
#
# Pick one of these tests
#
my $answer = '';
while(lc $answer ne 'q')
{
print <<__SELECTOR;
Which call do you like to see:
1) getCountries
2) getNameInfo
3) getNamesInCountry
Q) quit demo
__SELECTOR
$answer = $term->readline("Pick one of above [1/2/3/Q] ");
chomp $answer;
if($answer eq '1') { get_countries() }
elsif($answer eq '2') { get_name_info() }
elsif($answer eq '3') { get_names_in_country() }
elsif(lc $answer ne 'q' && length $answer)
{ print "Illegal choice\n";
}
}
exit 0;
#
# Get Countries
#
sub get_countries()
{
my $getCountries = $wsdl->compileClient('getCountries');
my $answer = $getCountries->();
if(my $fault_raw = $answer->{Fault})
{ my $fault_nice = $answer->{$fault_raw->{_NAME}};
die "Cannot get list of countries: $fault_nice->{reason}\n";
}
my $countries = $answer->{parameters}{country};
print "getCountries() lists ".scalar(@$countries)." countries:\n";
foreach my $country (sort @$countries)
{ print " $country\n";
}
}
#
# Get Name Info
#
sub get_name_info()
{
my $name = $term->readline("Personal name for info: ");
chomp $name;
length $name or return;
my $getNameInfo = $wsdl->compileClient('getNameInfo');
my $answer = $getNameInfo->(name => $name);
die "Lookup for '$name' failed: $answer->{Fault}{faultstring}\n"
if $answer->{Fault};
my $nameinfo = $answer->{parameters}{nameinfo};
print "The name '$nameinfo->{name}' is\n";
print " male: ", ($nameinfo->{male} ? 'yes' : 'no'), "\n";
print " female: ", ($nameinfo->{female} ? 'yes' : 'no'), "\n";
print " gender: $nameinfo->{gender}\n";
print "and used in countries:\n";
$format_list = join ', ', @{$nameinfo->{countries}{country}};
write;
}
#
# Get Names In Country
#
sub get_names_in_country()
{ my $getCountries = $wsdl->compileClient('getCountries');
my $getNamesInCountry = $wsdl->compileClient('getNamesInCountry');
my $answer1 = $getCountries->();
die "Cannot get countries: $answer1->{Fault}{faultstring}\n"
if $answer1->{Fault};
my $countries = $answer1->{parameters}{country};
my $country;
while(1)
{ $country = $term->readline("Most common names in which country? ");
chomp $country;
$country eq '' or last;
print " please specify a country name.\n";
}
# find the name case-insensitive in the list of available countries
my $name = first { /^\Q$country\E$/i } @$countries;
unless($name)
{ $name = 'other countries';
print "Cannot find name '$country', defaulting to '$name'\n";
print "Available countries are:\n";
$format_list = join ', ', @$countries;
write;
}
print "Most common names in $name:\n";
my $answer2 = $getNamesInCountry->(country => $name);
die "Cannot get names in country: $answer2->{Fault}{faultstring}\n"
if $answer2->{Fault};
my $names = $answer2->{parameters}{name};
$names
or die "No data available for country `$name'\n";
$format_list = join ', ', @$names;
write;
}
|