sramayah has asked for the wisdom of the Perl Monks concerning the following question:
I'm new to Perl and I need help. I have a MS web service on my local IIS 6.0 with windows server 2003.
The web service requires 3 parameters, memberno, postcode and country and returns a member object.
I created a virtual directory and hosted a test perl script to call my web service. When I run the script in a command prompt, everything looks good. My script runs OK and no security issues. I get back the values I need together with a soap response that looks like this:
) SOAP::Data=HASH(0x1b8ff90) SOAP::Data=HASH(0x1b90008) SOAP::Data::new: () SOAP::Data::new: () SOAP::Data::new: () SOAP::Data::new: () SOAP::Data::new: () SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x1b97 +130) SOAP::Transport::HTTP::Client::send_receive: POST http://localhost/IVR +WebServic /Membership.asmx Accept: text/xml Accept: multipart/* Content-Length: 750 Content-Type: text/xml; charset=utf-8 SOAPAction: http://www.doubleday.com.au/IsMemberValid <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsi="ht +tp://www. 3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap. +org/soap/ ncoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" x +mlns:xsd= http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schem +as.xmlsoa .org/soap/encoding/"><SOAP-ENV:Header><MyHeader xmlns="http://www.doub +leday.com au/"><MyName xsi:type="xsd:string">DoubleDayIVRWebServices</MyName></M +yHeader>< SOAP-ENV:Header><SOAP-ENV:Body><IsMemberValid xmlns="http://www.double +day.com.a /"><memberNo xsi:type="xsd:int">010105625</memberNo><postcode xsi:type +="xsd:int >6027</postcode><country xsi:type="xsd:string">A</country></IsMemberVa +lid></SOA -ENV:Body></SOAP-ENV:Envelope> SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x1a6 +f3ec) SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Cache-Control: private, max-age=0 Date: Tue, 11 Mar 2008 02:36:02 GMT Server: Microsoft-IIS/6.0 Content-Length: 537 Content-Type: text/xml; charset=utf-8 Client-Date: Tue, 11 Mar 2008 02:36:02 GMT Client-Peer: 127.0.0.1:80 Client-Response-Num: 1 MicrosoftOfficeWebServer: 5.0_Pub X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http: +//schemas xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchem +a-instanc " xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><IsMemberVal +idRespons xmlns="http://www.doubleday.com.au/"><IsMemberValidResult><validated> +true</val dated><comm_required>4</comm_required><comm_taken>161</comm_taken><com +m_remain> </comm_remain><outstanding_balance>0.0000</outstanding_balance></IsMem +berValidR sult></IsMemberValidResponse></soap:Body></soap:Envelope> SOAP::Deserializer::deserialize: () SOAP::Parser::decode: () SOAP::SOM::new: () true 4 161 0 0.0000 SOAP::Lite::DESTROY: () SOAP::Serializer::DESTROY: () SOAP::Data::DESTROY: () SOAP::Data::DESTROY: () SOAP::Data::DESTROY: ()
Here's the problem:
When I run a HTML page that submits values from the user and calls my test.pl script, my variables $comm_remain,$comm_required,$comm_taken and $outstanding_balance are not being populated. Maybe it is being populated! But I don't know how to find out. My test.pl script is a generated script and I added some smarts to talk to my web service. Added section is where I've mentioned CODE ADDED BY SR FOR IVR COMMERCE SERVER INTEGRATION:
#! /usr/bin/perl #======================================================= # Generated by ScriptGen v1.38 (build 126, "OS_BUILD") # at Thu Mar 06 15:15:30 2008 #======================================================= use warnings; use strict; use CGI qw(:all); use SOAP::Lite (+trace => 'all', maptype => {} ); use SOAP::Transport::HTTP; $|++; my $cgi = new CGI; #Variables ERR_CODE__ and ERR_DETAILS are reserved for errors indicati +on my $ERR_CODE__="0"; my $ERR_DETAILS__=""; #======================================================= # Input Parameters Section. DO NOT EDIT! #======================================================= #Name: member_number #Variable: member_number #Type: String #Comment: my $member_number = $cgi->param("member_number"); if (!(defined $member_number)) { $ERR_CODE__ = "2"; $ERR_DETAILS__ = "Input parameter 'member_number' is undefined"; } #Name: postcode #Variable: postcode #Type: String #Comment: my $postcode = $cgi->param("postcode"); if (!(defined $postcode)) { $ERR_CODE__ = "2"; $ERR_DETAILS__ = "Input parameter 'postcode' is undefined"; } #Name: country #Variable: country #Type: String #Comment: Will default to A for the Australian script my $country = $cgi->param("country"); if (!(defined $country)) { $ERR_CODE__ = "2"; $ERR_DETAILS__ = "Input parameter 'country' is undefined"; } #======================================================= # Output Parameters Section. DO NOT EDIT! #======================================================= #Name: comm_remain #Variable: comm_remain #Type: String #Comment: my $comm_remain=""; #Name: comm_required #Variable: comm_required #Type: String #Comment: my $comm_required=""; #Name: comm_taken #Variable: comm_taken #Type: String #Comment: my $comm_taken=""; #Name: outstanding_balance #Variable: outstanding_balance #Type: String #Comment: my $outstanding_balance=""; #======================================================= #=== PLEASE INSERT THE CODE HERE FOR ASSIGNING THE REAL VALUES #=== TO FOLLOWING VARIABLES: #=== $comm_remain, $comm_required, $comm_taken, $outstanding_balance #=== SET $ERR_CODE__ = "5" (i.e. "User Defined Error") #=== AND $ERR_DETAILS__ TO EXPLANATION STRING IF A WRONG CONDITION SHO +ULD ARISE. #=== {{{{{ #======CODE ADDED BY SR FOR IVR COMMERCE SERVER INTEGRATION my $soap = SOAP::Lite -> uri('http://www.doubleday.com.au/') -> on_action( sub { join '/', 'http://www.doubleday.com.au', $_[1] + } ) -> proxy('http://localhost/IVRWebService/Membership.asmx'); my $header = SOAP::Header->name(MyHeader => { MyName => "DoubleDayIVRWebServices" })->uri('http://www.doubleday.com.au/')->prefix(''); my @params = ( $header, SOAP::Data->name(memberNo => '0101001'), SOAP::Data->name(postcode => '6033'), SOAP::Data->name(country => 'A') ); my $method = SOAP::Data->name('IsMemberValid') ->attr({xmlns => 'http://www.doubleday.com.au/'}); my $result = $soap->call($method=>@params); if ($result->fault) { print $result->faultstring; } else { print $result->result; } $comm_required=$result->valueof('//IsMemberValidResult/comm_required') +; $comm_taken=$result->valueof('//IsMemberValidResult/comm_taken'); $comm_remain=$result->valueof('//IsMemberValidResult/comm_remain'); $outstanding_balance=$result->valueof('//IsMemberValidResult/outstandi +ng_balance'); #=== }}}}} #======================================================= # Output variables checking. #======================================================= if (!(defined $comm_remain && isvalidstring($comm_remain))) { $ERR_CODE__ = "3"; $ERR_DETAILS__ = "Invalid value '$comm_remain' for parameter 'comm_r +emain'"; } if (!(defined $comm_required && isvalidstring($comm_required))) { $ERR_CODE__ = "3"; $ERR_DETAILS__ = "Invalid value '$comm_required' for parameter 'comm +_required'"; } if (!(defined $comm_taken && isvalidstring($comm_taken))) { $ERR_CODE__ = "3"; $ERR_DETAILS__ = "Invalid value '$comm_taken' for parameter 'comm_ta +ken'"; } if (!(defined $outstanding_balance && isvalidstring($outstanding_balan +ce))) { $ERR_CODE__ = "3"; $ERR_DETAILS__ = "Invalid value '$outstanding_balance' for parameter + 'outstanding_balance'"; } print qq|Content-Type: text/xml\n\n|; print qq|<?xml version="1.0"?>|; print qq|<vxml version="2.0">|; print qq| <var name="__ERR_CODE__" expr = "$ERR_CODE__" />|; print qq| <var name="__ERR_DETAILS__" expr = "'| . convert2vxml($ERR_ +DETAILS__) . qq|'" />|; print qq| <var name="comm_remain" expr = "'| . convert2vxml($comm_rem +ain) . qq|'" />|; print qq| <var name="comm_required" expr = "'| . convert2vxml($comm_r +equired) . qq|'" />|; print qq| <var name="comm_taken" expr = "'| . convert2vxml($comm_take +n) . qq|'" />|; print qq| <var name="outstanding_balance" expr = "'| . convert2vxml($ +outstanding_balance) . qq|'" />|; print qq| <form id="DB_Test">|; print qq| <catch event="error.semantic.ecmascript">|; print qq| <var name="__ERR_CODE__" expr = "6" />|; print qq| <var name="__ERR_DETAILS__" expr = "'Returned VXML execut +ion error'" />|; print qq| <return namelist="__ERR_CODE__ __ERR_DETAILS__" />|; print qq| </catch>|; print qq| <block>|; print qq| <return namelist="__ERR_CODE__ __ERR_DETAILS__ comm_rem +ain comm_required comm_taken outstanding_balance" />|; print qq| </block>|; print qq| </form>|; print qq|</vxml>|; #======================================================= # Used functions. DO NOT EDIT! #======================================================= sub convert2vxml { $_ = shift; s/&/&/g; s/\\/\\\\/g; s/</</g; s/>/>/g; s/"/\\"/g; s/chr(8)/\\b/g; s/chr(9)/\\t/g; s/chr(10)/\\n/g; s/chr(11)/\\v/g; s/chr(12)/\\f/g; s/chr(13)/\\r/g; s/'/\\'/g; return $_; } sub isvaliddate { my $input = shift; my $DataPattern = '^(?:(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01]) +[- /.]((?:19|20)\d\d))$'; if ($input =~ m!$DataPattern!) { # At this point, $3 holds the year, $1 the month and $2 the day of + the date entered if ($2 == 31 and ($1 == 4 or $1 == 6 or $1 == 9 or $1 == 11)) { return 0; # 31st of a month with 30 days } elsif ($2 >= 30 and $1 == 2) { return 0; # February 30th or 31st } elsif ($1 == 2 and $2 == 29 and not ($3 % 4 == 0 and ($3 % 100 ! += 0 or $3 % 400 == 0))) { return 0; # February 29th outside a leap year } else { return 1; # Valid date } } else { return 0; # Not a date } } sub isvalidtime { my $input = shift; my $TimePattern = '^(([0-1][0-9]|2[0-3]):[0-5][0-9])$'; if ($input =~ m!$TimePattern!) { return 1; } return 0; } sub isvalidnumber { my $input = shift; my $NumberPattern = '^([-+]?([0-9]*\.)?[0-9]+)$'; if ($input =~ m!$NumberPattern!) { return 1; } return 0; } sub isvalidinteger { my $input = shift; my $IntegerPattern = '^([-+]?[0-9]+)$'; if ($input =~ m!$IntegerPattern!) { return 1; } return 0; } sub isvalidstring { my $input = shift; return 1; } sub SOAP::Transport::HTTP::Client::get_basic_credentials { return 'LAN\username' => 'password'; }
On IE, this is what's being returned:
Please help.<?xml version="1.0" encoding="UTF-8" ?> - <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-insta +nce" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns +:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http +://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas. +xmlsoap.org/soap/encoding/"> - <SOAP-ENV:Header> - <MyHeader xmlns="http://www.doubleday.com.au/"> <MyName xsi:type="xsd:string">DoubleDayIVRWebServices</MyName> </MyHeader> </SOAP-ENV:Header> - <SOAP-ENV:Body> - <IsMemberValid xmlns="http://www.doubleday.com.au/"> <memberNo xsi:type="xsd:int">010105625</memberNo> <postcode xsi:type="xsd:int">6027</postcode> <country xsi:type="xsd:string">A</country> </IsMemberValid> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: MS Web Service SOAP Calls with Perl
by InfiniteLoop (Hermit) on Mar 12, 2008 at 15:30 UTC |