Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

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 ( #955135=note: print w/ replies, xml ) Need Help??


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

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?


Comment on Re^2: Trouble getting started with SOAP (SOAP::Lite, SOAP::WSDL), translating from PHP to Perl
Re^3: Trouble getting started with SOAP (SOAP::Lite, SOAP::WSDL), translating from PHP to Perl
by tangent (Deacon) on Feb 20, 2012 at 20:14 UTC
    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. :-(

        AFAIK, the parameters passed in a WSDL tranaction are in XML format, so I think the PHP classes at some point serialize to XML, though that is not obvious from the PHP code you posted. From what I could make out of SOAP::WSDL::Manual - Accessing WSDL based web services, you will need to create a class (or classes) which is a subclass of SOAP::WSDL::XSD::Typelib::ComplexType and then use that in much the same way as the PHP call does. The information you need to define your classes will be in the wsdl file somewhere, though you might be able to just adapt what's there in the PHP.

        Update - Looking at the docs again, it gives this example:
        my $soap = SOAP::WSDL->new( wsdl => 'file://bla.wsdl', ); my $result = $soap->call('MyMethod', %data);
        It says "Your data is serialized according to the rules in the WSDL" so it looks like you could feed in your wsdl file and then see what it expects %data to be. And do hang around for a bit, I'm sure someone else here can s/:-(/:-)/

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://955135]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (13)
As of 2014-08-22 14:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (158 votes), past polls