Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SOAP - Objects :-s

2 views
Skip to first unread message

Morten P

unread,
Jan 12, 2010, 5:47:42 PM1/12/10
to
Jeg skal tilg� en SOAP server, der kr�ver at jeg f�rst kalder new() i den,
med en r�kke parametre, som den gemmer i instans variablen, og derefter
metoderne.

Serveren er skrevet i Perl og anvender ikke WSDL.


Jeg har fors�gt med (pseudo kode):

$client = new SOAP client;
$new = $client->new($parms);
$res = $client->method($new, $parms);


Er det ikke det der koncetuelt set skal g�res?

Jeg fandt det p� google for et �r siden, men har selvf ikke gemt siden og nu
er det umuligt at finde eksempler p� anvendelsen af SOAP som OOP.

Nogen bud p� l�sninger eller links til sider der beskriver
problemstillingen? :-)


Jonathan Stein

unread,
Jan 13, 2010, 7:36:37 AM1/13/10
to
Morten P skrev:

> Jeg fandt det p� google for et �r siden, men har selvf ikke gemt siden og nu
> er det umuligt at finde eksempler p� anvendelsen af SOAP som OOP.

SOAP er ikke den bedst dokumenterede del af PHP, men pr�v at kigge p�
eksemplerne p� http://www.php.net/manual/en/soapclient.soapclient.php
hvis du ikke allerede har v�ret der...

M.v.h.

Jonathan

--
Er din email vigtig? Er du tr�t af, at din hjemmeside er nede?
Stabilt webhotel p� redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Michael Rasmussen

unread,
Jan 13, 2010, 11:50:29 AM1/13/10
to
On Tue, 12 Jan 2010 23:47:42 +0100
"Morten P" <sp...@spam.spam> wrote:

>
> Nogen bud på løsninger eller links til sider der beskriver
> problemstillingen? :-)
>
Du kan jo se, om du kan bruge mine undervisningsplancher til noget
brugbart:-)

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.

Michael Rasmussen

unread,
Jan 13, 2010, 11:52:05 AM1/13/10
to
On Wed, 13 Jan 2010 17:50:29 +0100
Michael Rasmussen <m...@miras.org> wrote:

> Du kan jo se, om du kan bruge mine undervisningsplancher til noget
> brugbart:-)
>

Glemte lige linket:o)
http://www.datanom.net/foredrag/php/soap/

Morten P

unread,
Jan 13, 2010, 5:07:05 PM1/13/10
to

"Michael Rasmussen" <m...@miras.org> wrote in message
news:20100113175...@sleipner.datanom.net...

> On Wed, 13 Jan 2010 17:50:29 +0100
> Michael Rasmussen <m...@miras.org> wrote:
>
>> Du kan jo se, om du kan bruge mine undervisningsplancher til noget
>> brugbart:-)
>>
> Glemte lige linket:o)
> http://www.datanom.net/foredrag/php/soap/

Gode noter :-)

Dog er lige pr�cis min problemstilling hverken d�kket af dine noter eller
linket til manualen.

F�rst en instans new() med variabler i, og dern�st et metodekald der netop
l�ser variablerne fra instansen.

Jeg anvender mig af (brudstykker):

$this->client = new SoapClient
(
null,
array
(
'location' => $this->host,
'uri' => $this->NS,
'trace' => $this->verbose,
'exceptions' => $this->verbose,
)
);


# $func = new
$new = $this->client->$func ($arr_parms_to_new);

# $func = send_sms
$res = $this->client->$func ($new, $arr_parms_to_send_sms);


Sjovt nok, da mit namespace tidligere blot var:

SMS

virkede alting perfekt!

Nu, hvor det er :

urn:COM::GSM::Soap::SMS


fungerer det ikke.
Perl serveren �r namespacet ind som en streng og ikke som et objekt, som den
gjorde da NS blot var SMS.

Og det er vitterligt det eneste jeg har �ndret!

Jeg har noget i koncepter identisk kode i en Perl klient hvor det fungerer
:-O


Er der noget omkring NS jeg har misset totalt?


Michael Rasmussen

unread,
Jan 13, 2010, 5:29:02 PM1/13/10
to
On Wed, 13 Jan 2010 23:07:05 +0100
"Morten P" <sp...@spam.spam> wrote:

>
>
> Er der noget omkring NS jeg har misset totalt?
>

Har du en URL til serveren, eller mulighed for at vise kildekoden til
serveren?

Martin

unread,
Jan 14, 2010, 1:30:02 PM1/14/10
to
On 12-01-2010 23:47, Morten P wrote:
> Jeg skal tilg� en SOAP server, der kr�ver at jeg f�rst kalder new() i den,
> med en r�kke parametre, som den gemmer i instans variablen, og derefter
> metoderne.
>
> Serveren er skrevet i Perl og anvender ikke WSDL.
>
>
> Jeg har fors�gt med (pseudo kode):
>
> $client = new SOAP client;
> $new = $client->new($parms);
> $res = $client->method($new, $parms);

Selvom en SOAP server har WDSL, s� kan forbindelserne stadig se vidt
forskellige ud...

Jeg har et par eksempler med

$this->proxy = new SoapClient($url);
$this->session = $this->proxy->login($user,$pass);
$this->proxy->call($this->session, $params);


$this->proxy = new SoapClient($url, $params);
$this->proxy->Connect($params);
$this->proxy->Product_GetAll()->Product_GetAllResult->ProductHandle;


Den �verste er skrevet med Zend_Soap_Server, den nederste ved jeg s� dog
ikke

Morten P

unread,
Jan 17, 2010, 2:58:52 AM1/17/10
to

"Michael Rasmussen" <m...@miras.org> wrote in message
news:20100113232...@sleipner.datanom.net...

> On Wed, 13 Jan 2010 23:07:05 +0100
> "Morten P" <sp...@spam.spam> wrote:
>
>>
>>
>> Er der noget omkring NS jeg har misset totalt?
>>
> Har du en URL til serveren, eller mulighed for at vise kildekoden til
> serveren?


Jep, jeg er lige ved at koge den ned til det absolut minimum n�dvendige for
overskuelighedens skyld :-)

Jeg 100% sikker p� det er min encoding af det f�rste new() kald n�r jeg
sender det med som parameter til det n�ste kald, der g�r galt.

Mere info senere :-)


Morten P

unread,
Jan 17, 2010, 3:30:08 AM1/17/10
to

"Michael Rasmussen" <m...@miras.org> wrote in message
news:20100113232...@sleipner.datanom.net...

> On Wed, 13 Jan 2010 23:07:05 +0100
> "Morten P" <sp...@spam.spam> wrote:
>
>>
>>
>> Er der noget omkring NS jeg har misset totalt?
>>
> Har du en URL til serveren, eller mulighed for at vise kildekoden til
> serveren?


Alright, serveren er her [1]

Et test perl-script der fungerer er her [2]
Et letttere rodet php script er her [4]


Output af Perl scriptet og php scriptet [3]

Jeg �nsker at skrive et php script, der g�r pr�cis det samme som perl
scriptet.

Bem�rk forskellen p� serverens output af de to scripts:

perl:
self: COM::GSM::Soap::Server=HASH(0x86b3d78)

php:
self: COM::GSM::Soap::Server

Giga lang og sikkert umulig at overskue post, men h�ber nogen vil give det
et skud, da jeg med garanti ikke kommer i m�l med flere dages trial'n'error
nu :-D


[1]
#!/usr/bin/perl

use strict;
use warnings;

$SIG {__WARN__} = sub { die(@_) };

use ADV::Repos::SOAP_server;

ADV::Repos::SOAP_server::start(
{
'port' => 30000,
'packages' => ['COM::GSM::Soap::Server'],
'verbose' => 1,
}
);

package COM::GSM::Soap::Server;

use strict;
use warnings;
use Data::Dumper;

$SIG {__WARN__} = sub { die(@_) };

sub new
{
my $self = shift;
my $class = ref ($self) || $self;

my $parms = (@_) ? shift : {};

$self = {
'array' => [],
'hash' => {},
'scalar' => 'x',
};

bless ($self, $class);

while (my ($key, $value) = each %$parms)
{
$self->{$key} = $value;
}

return $self;
}


sub SOAP_methods
{
my $self = shift;

return ['new','test'];
}


sub test
{
my $self = shift;

print Dumper $self;

print 'self: '. $self ."\n";
print 'ref(self): '. ref($self) ."\n";
print 'is_ref: '. (ref($self) eq '') ? 'NO!' : 'Yes :-)';
print "\n\n\n";

$self->{'dimmer'} = time();

return $self;
}

1;

[2]
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use SOAP::Lite;

$SIG {__WARN__} = sub { die(@_) };


my $client = SOAP::Lite
->proxy('http://localhost:30000/')
->uri('urn:COM::GSM::Soap::Server')
->on_fault(\&my_soap_error);


my $parms = {
'parm_01' => 'abc',
'parm_02' => '123',
};

my $new = $client
->on_fault(\&my_soap_error)
->call(new => $parms)
->result;

print Dumper $new;
$parms = {
'parm_03' => 'def',
'parm_04' => '456',
};

my $res = $client
->on_fault(\&my_soap_error)
->test($new, $parms)
->result;

print Dumper $res;


sub my_soap_error {

my $self = shift;
my $res = shift;

die $res->faultstring
if ref $res;

die $self->transport->status;
}


[3]
Exporting package COM::GSM::Soap::Server
method: COM::GSM::Soap::Server::new
method: COM::GSM::Soap::Server::test
Listening on port 30000
$VAR1 = bless( {
'scalar' => 'x',
'hash' => '',
'array' => [],
'parm_01' => 'abc',
'parm_02' => '123'
}, 'COM::GSM::Soap::Server' );
self: COM::GSM::Soap::Server=HASH(0x86b3d78)
ref(self): COM::GSM::Soap::Server
NO!


$VAR1 = 'COM::GSM::Soap::Server';
self: COM::GSM::Soap::Server
ref(self):
NO!


Uncaught error: Can't use string ("COM::GSM::Soap::Server") as a HASH ref
while "strict refs" in use at ./server.pl line 71.


[4]
<?php

$host = 'http://localhost:30000/';
$NS = 'urn:COM::GSM::Soap::Server';
$method = 'test';

$parms_new = array (
'parm_01' => 'abc',
'parm_02' => '123',
);

$parms = array (
'parm_03' => 'def',
'parm_04' => '456',
);


try
{
$client = new SoapClient
(
null,
array
(
'location' => $host,
'uri' => $NS,
'trace' => 1,
'exceptions' => 1,
)
);
}
catch (SoapFault $exception)
{
die (htmlentities ($exception->faultstring));
}

try
{
$new = $client->new($parms_new);
}
catch (SoapFault $exception)
{
die(htmlentities ($exception->faultstring));
}

#var_dump($new);

$new_enc = encode($new);
#$parms_enc = encode(array($new, $parms));
$parms_enc = encode($parms);

var_dump($parms_enc);

try
{
# $obj = $client->$method($new_enc, $parms_enc);
# $obj = $client->$method($parms_enc);
$obj = $client->__soapCall($method, array($new_enc, $parms_enc));
}
catch (SoapFault $exception)
{
# var_dump($exception);

die(htmlentities ($exception->faultstring));
}

function encode ($input) {

global $NS, $host;

# OBJECT
if (is_object ($input))
return new SoapVar ($input,
SOAP_ENC_OBJECT,
$NS,
$host
);

# ARRAY
if (is_array ($input))
{
return new SoapVar($input,
SOAP_ENC_ARRAY,
$NS,
$host
);
}


# STRING
return new SoapVar ($input, XSD_BASE64BINARY);
}


?>


Jonathan Stein

unread,
Jan 17, 2010, 8:02:39 AM1/17/10
to
Morten P skrev:

> 'trace' => 1,

N�r trace er sl�et til, kan du f� det pr�cise SOAP-kald. Jeg bruger
f�lgende, n�r jeg debugger SOAP-fejl:
} catch (Exception $e) {
echo "SOAP Error: $e\r\n";
echo $client->__getLastRequestHeaders()."\r\n";
echo $client->__getLastRequest()."\r\n";
echo $client->__getLastResponseHeaders()."\r\n";
echo $client->__getLastResponse()."\r\n";
}

I �vrigt har jeg oplevet mirakler, n�r parametrene bliver �ndret til
objekter. F.eks.:
$params = new stdClass();
$params->var1 = 'Variabel 1';
o.s.v.

Der er stadig lidt woodoo over PHP's SOAP implementation, s�
__getLastRequest er guld v�rd, n�r man skal se hvordan ens parametre
egentlig bliver overf�rt.

Morten P

unread,
Jan 17, 2010, 10:54:22 AM1/17/10
to
> N�r trace er sl�et til, kan du f� det pr�cise SOAP-kald. Jeg bruger
> f�lgende, n�r jeg debugger SOAP-fejl:

N�r jeg �ndrer NS i server og klient til 'Server' og alts� uden '::'erne s�
virker det perfekt i b�de Perl og PHP :-/

Exporting package Server
method: Server::new
method: Server::test


Listening on port 30000
$VAR1 = bless( {
'scalar' => 'x',
'hash' => '',
'array' => [],
'parm_01' => 'abc',
'parm_02' => '123'

}, 'Server' );
self: Server=HASH(0x86b3e44)
ref(self): Server
NO!


$VAR1 = bless( {


'array' => [],
'hash' => '',
'scalar' => 'x',

'parm_01' => 'abc',
'parm_02' => '123'

}, 'Server' );
self: Server=HASH(0x875bfa4)
ref(self): Server
NO!


> I �vrigt har jeg oplevet mirakler, n�r parametrene bliver �ndret til
> objekter. F.eks.:
> $params = new stdClass();
> $params->var1 = 'Variabel 1';


Det m� jeg pr�ve :-)

Og jo, det er noget af en black box n�r man ike kender det hele i forvejen
:-)

Michael Rasmussen

unread,
Jan 17, 2010, 11:26:41 AM1/17/10
to
On Sun, 17 Jan 2010 16:54:22 +0100
"Morten P" <sp...@spam.spam> wrote:

>
> Når jeg ændrer NS i server og klient til 'Server' og altså uden '::'erne så
> virker det perfekt i både Perl og PHP :-/
>
Ahh ja, selvfølgelig.
urn:COM::GSM::Soap::Server er ikke et lovligt namespace navn. "A
namespace is declared using the reserved XML attribute xmlns, the value
of which must be an Internationalized Resource Identifier (IRI)". I
SOAP sammenhæng er en IRI identisk med en Uniform Resource Identifier
(URI). http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

Morten P

unread,
Jan 17, 2010, 1:05:30 PM1/17/10
to
> Ahh ja, selvf�lgelig.

> urn:COM::GSM::Soap::Server er ikke et lovligt namespace navn. "A
> namespace is declared using the reserved XML attribute xmlns, the value
> of which must be an Internationalized Resource Identifier (IRI)". I
> SOAP sammenh�ng er en IRI identisk med en Uniform Resource Identifier
> (URI). http://en.wikipedia.org/wiki/Uniform_Resource_Identifier


Aha!

Alright... I Perl har klassen jo navnet:

'COM::GSM::Soap::Server' som angiver den sti den ligger installeret under.
Jeg ville egentligt helst bevare denne syntaks.

Perl serveren g�r en 'eval("require $URI")' for at f� filen med og for at
instantiere klassen skal man faktisk angive det fulde pakke navn 'COM...'


Perl-SOAP til Perl-server er �benbart ret l�s i det, s� der kan jeg angive
b�de :: og / i NS.

I php->Perl server ingen af delene.

Umiddelbart, hvis jeg �nsker kompatibilitet mellem b�de php og perl, tvinges
jeg alts� til at v�lge et pakkenavn uden :: i.

Jeg er desv�rre ikke specielt dygtig p� URI/XML/SOAP osv, men er ovenst�ende
korrekt opfattet?

Eller har du/andre et forslag p� hvad jeg kan g�re for at f� sendt de samme
requests som perl klienten �benbart er i stand til? :-)

Michael Rasmussen

unread,
Jan 17, 2010, 3:22:56 PM1/17/10
to
On Sun, 17 Jan 2010 19:05:30 +0100
"Morten P" <sp...@spam.spam> wrote:

>
> 'COM::GSM::Soap::Server' som angiver den sti den ligger installeret under.
> Jeg ville egentligt helst bevare denne syntaks.
>

Du skal lave en associering mellem pakkenavnet og et namespace, så du
får interoperabilitet. Syntaksen bar::foo::some_server forstås kun af
Perl.

> Perl-SOAP til Perl-server er åbenbart ret løs i det, så der kan jeg angive
> både :: og / i NS.
>
Den opfører sig helt normalt. Hvad du ser, er det samme som .NET
remoting eller Java RMI. Modtager den ene side en binær blob, kan den
håndtere den, da det internt er samme sprog - dvs. der behøves ingen
oversættelse fra SOAP til Perl, da meddelelsen allerede er i Perl. PHP
forstår selvfølgeligt ikke Perl:-)

> Umiddelbart, hvis jeg ønsker kompatibilitet mellem både php og perl, tvinges
> jeg altså til at vælge et pakkenavn uden :: i.
>
> Jeg er desværre ikke specielt dygtig på URI/XML/SOAP osv, men er ovenstående
> korrekt opfattet?
>
> Eller har du/andre et forslag på hvad jeg kan gøre for at få sendt de samme
> requests som perl klienten åbenbart er i stand til? :-)
>
SOAP::Lite har metoderne ns og default_ns, der må kunne anvendes til at
lave en associering mellem et namespace og en pakke.

xmlns="urn:COM.GSM.Soap.server"

for metoden test vil et kald til test blive opfattet på denne måde:
{urn:COM.GSM.Soap.server}test

Morten P

unread,
Jan 18, 2010, 2:35:46 PM1/18/10
to
Den opf�rer sig helt normalt. Hvad du ser, er det samme som .NET
remoting eller Java RMI. Modtager den ene side en bin�r blob, kan den
h�ndtere den, da det internt er samme sprog - dvs. der beh�ves ingen
overs�ttelse fra SOAP til Perl, da meddelelsen allerede er i Perl. PHP
forst�r selvf�lgeligt ikke Perl:-)


Aha!
Det giver jo god mening :-)


SOAP::Lite har metoderne ns og default_ns, der m� kunne anvendes til at


lave en associering mellem et namespace og en pakke.

xmlns="urn:COM.GSM.Soap.server"

for metoden test vil et kald til test blive opfattet p� denne m�de:
{urn:COM.GSM.Soap.server}test


Det er faktisk ret sp�ndende :-)
Jeg har g�et og tnkt lidt over at nu hvor det er s� besv�rligt er der nok en
grund til det. Det er nok fordi jeg er p� afveje! Egentligt fors�ger jeg at
tvinge noget perl specifikt ned i klienten og det strider jo mod hele
konceptet om at have SOAP som middleware der g�r kommunikationen generel.

Jeg er endt med at kalde min klasse SMS og lade klienterne kalde den
direkte, hvilket jo har fungeret hele tiden :-)

MANGE tak for hj�lpen! Det har virkeligt v�ret l�rerigt :)


0 new messages