Re: [SOAP] GsoaP/PEAR::SOAP interoperability
| From: | (Mauro Chojrin) | Date: | Mon, 08 Nov 2004 17:42:39 +0000 |
| Subject: | Re: [SOAP] GsoaP/PEAR::SOAP interoperability | ||
| References: | 1 2 | Groups: | php.soap |
| Request: | Send a blank email to php-soap+get-1648@lists.php.net to get a copy of this message | ||
Hi:
I'm having a similar trouble, I'm using a PHP PEAR::SOAP server (I think it's the same HelloServer from the example) and I'm using a gSoap C++ client to retrieve the answer from it. The problem I have is that when I print the resulting string it's allways empty. I have the answer from the server, so I believe the call is going fine, so could you tell me if I'm doing something wrong on my code? Thanks.
Server Response:
T 10.1.0.10:80 -> 10.1.0.141:32823 [AP]
HTTP/1.1 200 OK..Date: Thu, 04 Nov 2004 13:56:30 GMT..Server:
Apache/1.3.26
(Unix) DAV/1.0.3 PHP/4.3.0..X-Powered-By: PHP/4.3.0..Status: 200
OK..Conte
nt-Length: 544..Connection: close..Content-Type: text/xml;
charset=UTF-8...
.<?xml version="1.0" encoding="UTF-8"?>....<SOAP-ENV:Envelope
xmlns:SOAP-E
NV="http://schemas.xmlsoap.org/soap/envelope/"..
xmlns:xsd="http://www.w3.o
rg/2001/XMLSchema"..
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".
. xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"..
xmlns:ns4="u
rn:HelloServer"..
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/e
ncoding/">..<SOAP-ENV:Body>....<ns4:sayHelloResponse>..<return
xsi:type="xs
d:string">Hello
Mauro</return></ns4:sayHelloResponse>..</SOAP-ENV:Body>..</
SOAP-ENV:Envelope>..
Code for the main app:
#include <iostream.h>
#include "soapH.h"
#include "HelloServerBinding.nsmap"
void main( int argc, char * argv[])
{
struct soap soap;
soap_init( &soap );
struct ns1__sayHelloResponse rta;
char * nombre;
if ( argc > 1 )
{
nombre = argv[1];
}
else
{
cout << "Ingrese un nombre" << endl;
exit(0);
}
rta.outputString = "Hola mundo!";
cout << "Antes: " << rta.outputString << endl;
int rtaSoap = soap_call_ns1__sayHello( &soap, "", "", nombre, rta );
cout << "Despues: " << rta.outputString << endl;
cout << "Respuesta del soap " << rtaSoap << endl;
}
Owain Perry wrote:
Norb, Sorry not had a chance to reply before, Just using a modified version of the quote example in the samples directory that comes with Gsoap, I have used a stuct to return , so you can see how they fit in if you need to pass complex structures around. Let me know if you have any problems.
This is the c++ header file. <snip>
typedef char * xsd__string; int ns__sendback (char * password, struct ns__sendbackResponse {xsd__string _return_;} * out);
</snip>
This is the c++ code. <Snip>
#include "soapH.h" /* include generated proxy and SOAP support */
int main(int argc, char **argv) { struct soap soap; struct ns__sendbackResponse q; char *sym; if (argc > 1)sym = argv[1];else {fprintf(stderr, "Usage: quote <ticker>n"); exit(1);} soap_init(&soap); if (soap_call_ns__sendback(&soap, "http://redfairy/soap/testserver.php", "",sym , &q) == 0)printf("Input was %s soap call returned - %sn", sym, q._return_);elsesoap_print_fault(&soap, stderr);soap_end(&soap); soap_done(&soap); return 0; }
/* The namespace mapping table is required and associates namespace prefixes with namespace names: */ struct Namespace namespaces[] = {{"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, /* MUST befirst */{"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, /* MUST besecond */ {"xsi", "http://www.w3.org/1999/XMLSchema-instance","http://www.w3.org/*/XMLSchema-instance"}, /* MUST be third */{"xsd", "http://www.w3.org/1999/XMLSchema", "http://www.w3.org/*/XMLSchema"},{"ns", "urn:test_Server"}, /* Method namespace URI */{NULL, NULL} };
</snip>
and the php server
<snip>
<?php
// first, include the SOAP/Server class require_once 'SOAP/Server.php';
class Test1 {
// Stores instance of PEAR::SOAP Server
var $soapServer;
// Constructor builds PEAR::SOAP Server
function Test1 ()
{
// Switch off notices to all GET
error_reporting(E_ALL ^ E_NOTICE);
// Instantiate PEAR::SOAP SOAP_Server
$this->soapServer=new SOAP_Server;
// Build the object map (using this instance) + add a namespace
$this->soapServer->addObjectMap($this,'urn:test_Server');
// Turn on the server
$this->soapServer->service($GLOBALS['HTTP_RAW_POST_DATA']);
}
function serverTimestamp()
{
return time();
}
function sendback($name)
{
return 'Hello '.$name;
}
}
// Start the SOAP server $test = new Test1; ?>
</snip>
Have fun
O.
-----Original Message----- From: PHPDiscuss - PHP Newsgroups and mailing lists [mailto:nblam@austin.rr.com] Sent: 04 May 2004 19:12 To: soap@lists.php.net Subject: Re: [SOAP] GsoaP/PEAR::SOAP interoperability
Thanks O for answering my posting.
That would be great if you could send me a example (like 'hello' below) of a GSOAP client making a request to a PEAR::SOAP server. Also, if you have an example of structures or lists that are being passed as a SOAP response. I have a MySQL database that is being queried by my backend PHP code and am wondering how to pass multiple types via SOAP.
Thanks again, Norb
Here's the corresponding C code which is currently failing:
C Code:
#include "soapH.h" #include "ns.nsmap"
const char server[] = "http://192.168.2.102/test/pear_soap/examples/ws/testserver1.php";
int main(int argc, char **argv) { struct soap soap; char result[50]; char *pass_variable;
pass_variable = result;
soap_init(&soap);
soap_call_ns4__hello(soap_new(), server, "", "bonnie girl", &pass_variable);
if (soap.error) soap_print_fault(&soap,stderr);
else {
printf("successful");
printf("result: %s", pass_variable);
}
return 0;
}
Here's the corresponding PHP server side code:
<?php
class Test1 {
// Stores instance of PEAR::SOAP Server
var $soapServer;
// Constructor builds PEAR::SOAP Server
function Test1 () {
// Switch off notices to all GET
error_reporting(E_ALL ^ E_NOTICE);
// Instantiate PEAR::SOAP SOAP_Server
$this->soapServer=new SOAP_Server;
// Build the object map (using this instance) + add a namespace
$this->soapServer->addObjectMap($this,'http://www.phppatterns.com#Test1');//$this->soapServer->addObjectMap($this,'http://tempuri.org');
// Turn on the server
$this->soapServer->service($GLOBALS['HTTP_RAW_POST_DATA']);
}
function serverTimestamp() {
return time();
}
function hello($name) {
return 'Hello '.$name;
}
function hello1() {
return 'Hello from PEAR';
}
}
?>
Owain Perry wrote:
Norb,
I can confirm that I have got GSOAP 2.4 & 2.5 working fine withPEAR::Soap,but I have only been passing strings around and not really tested anyotherdata types. Apart from Attachments which don't seem to work that well as PEAR::SOAP doesn't build the options array that gsoap expects, but thiscanbe worked around. let me know if you need some code.
O.
-----Original Message----- From: PHPDiscuss - PHP Newsgroups and mailing lists [mailto:nblam@austin.rr.com] Sent: 27 April 2004 03:00 To: soap@lists.php.net Subject: [SOAP] GsoaP/PEAR::SOAP interoperability
I've been trying to get my C++ gsoap client request to work with my PHP PEAR::SOAP server response.
Has anyone ever tried this and get it to work? Here are the details:
GSOAP request:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns4="http://www.phppatterns.com#Test1">
<SOAP-ENV:Body id="_0"><hello xmlns="http://www.phppatterns.com#Test1"> <param-1>bonnie girl</param-1> </hello></SOAP-ENV:Body> </SOAP-ENV:Envelope>
PEAR::SOAP response:
HTTP/1.1 200 OK Date: Tue, 27 Apr 2004 01:50:52 GMT Server: Apache/1.3.27 (Unix) PHP/4.3.1 DAV/1.0.3 mod_ssl/2.8.14 OpenSSL/0.9.6b X-Powered-By: PHP/4.3.1 Status: 200 OK Content-Length: 561 Connection: close Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns4="http://www.phppatterns.com#Test1" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body>
<ns4:helloResponse> <return xsi:type="xsd:string">Hello bonnie girl</return></ns4:helloResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Everything looks good except GSOAP doesn't like the <return> tag according to the following debug message:
Unknown element 'return' (level=3, 1) IGNORING element 'return' End element found (level=3) 'return'=''
A more generic question:
Has anyone ever gotten a C++ SOAP client (any SOAP implementation) to correct communicate with a PHP SOAP Server (Any SOAP implementation)
Thanks in Advance
Norb
-- PHP Soap Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
-- PHP Soap Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php