http://www.perlmonks.org?node_id=955129


in reply to Trouble getting started with SOAP (SOAP::Lite, SOAP::WSDL), translating from PHP to Perl

I don't do PHP, but I can help you to get started with SOAP::WSDL. Here's an example that gets the current weather for KSFO(San Francisco):
#!/usr/bin/perl use strict; use warnings; use SOAP::WSDL; my $soap = SOAP::WSDL->new(); my $som = $soap->wsdl( "http://www.webservicex.net/GlobalWeather.asmx?WSDL") -> call('GetWeather', GetWeather => { CountryName => 'United States', CityName => 'San Francisco' } ); print $som->result(), "\n";
  • Comment on Re: Trouble getting started with SOAP (SOAP::Lite, SOAP::WSDL), translating from PHP to Perl
  • Download Code

Replies are listed 'Best First'.
Re^2: Trouble getting started with SOAP (SOAP::Lite, SOAP::WSDL), translating from PHP to Perl
by Anonymous Monk on Feb 20, 2012 at 19:47 UTC

    Thanks Khen1950fx

    It is nice to have one example that works.

    Do you have a working example for a cgi server?

    SOAP itself looks to be simple enough, looking like a variant of XML (which for me is quite familiar). But, it is the communication between the client and server which doesn't seem so simple. For example, it looks like the core problem I have with the WSDL file for which I have the URL, appears to be the use of complex data types. It is clear to me that the call I quoted from the working PHP script has created definitions of two classes, and that the second argument to SOAPClient is some kind of array with pointers or a map to the class definitions. I have not found anything that is obviously similar to that in Perl's various SOAP packages. Suppose I wanted to create a server and a client that handled peronal IDs and addresses, and started by creating a person class and an address class (with the peerson class having an address as a data member). How would I create the server to both receive such data and how would I write the client so that it knows about these classes? I don't know PHP that well, but I assume my perl SOAP client would not be able to connect to the server unless it includes the class definitions when it first tries to connect (mimicing what the PHP code seems to do). But then, the question is, how do I do that?

      Can you show more of the PHP code (ugh) - does it reference those classes anywhere else? I'm assuming you can't acquire the specification for the 'https://the.soap.url/api/'?

        Well, the class definitions and initializations are trivially simple (brain dead relative to C++):

        class CreditCardType { var $cc_id = null; var $cc_type = null; var $cc_currency = null; var $cc_holder_name = null; var $cc_number = null; var $cc_month = null; var $cc_year = null; var $cc_cvv = null; var $cc_default = null; var $cc_status = null; var $cc_status_infos = null; var $cc_creation = null; var $cc_lastupdate = null; } echo "Processing Credit Card Transaction\n"; $CreditCard = new CreditCardType(); $CreditCard->cc_type = "VISA"; // mandatory $CreditCard->cc_holder_name = "DEMO USER"; // mandatory $CreditCard->cc_number = "4444333322221111"; // mandatory $CreditCard->cc_cvv = "123"; // mandatory $CreditCard->cc_month = "12"; // mandatory $CreditCard->cc_year = "2014"; // mandatory

        The call to SOAPClient is, again:

        $soap = new SoapClient("https://merchant.paytoo.info/api/merchant?wsdl +", array("classmap"=>array("AccountType"=>"AccountType", "CreditCardT +ype"=>"PaytooCreditCardType")));

        And then it is used (with instances of other classes) like:

        $response = $soap->CreditCardSingleTransaction($CreditCard, $Customer, + $amount, $currency, $ref_id, $description, $addinfo);

        I do have the full wsdl file, but I don't know that I can post any of it since I did not write any of it. For that matter, it would be handy to locate a decent WSDL editor (my favourite eitors don't provide any supports for it beyond what any braindead Notepad clone would do).

        I am so frustrated with this, I am sorely tempted to make a PHP file template that my Perl CGI programs can edit to have the right data, and then ran that using php and parse the output that results in order to get the result. :-(