Soap API met NuSoap werkt niet zoals gewenst
Ik ben nu enkele dagen bezig om een Soap API/Webservice op te zetten, maar vooralsnog zonder succes.
Het framework voor de website die ik gebruik is CodeIgniter, en voor soap gebruik ik NuSoap.
Dit is het stuk source van de Soap SERVER:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Api extends Globals{
public function __construct(){
parent::__construct();
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
$this->load->library("nuSoap_lib");
$server = new soap_server();
$this->server = $server;
$server->configureWSDL("My API", $this->http . $this->site . '/api/');
$server->schemaTargetNamespace = $this->http . $this->site . '/api/';
$server->wsdl->addComplexType(
"user",
"complexType",
"struct",
"all",
"SOAP-ENC:struct",
array(
"user" => array("name" => "user", "type" => "xsd:struct")
)
);
$server->register(
"gallery.get_user",
array(),
array("return" => "tns:user"),
"urn:GalleryWSDL",
"urn:GalleryWSDL#getUser",
"rpc",
"encoded",
"Returns the information of a certain member"
);
}
public function index(){
function get_user(){
$user = array(
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3'
);
return $user;
}
$this->server->service(file_get_contents("php://input"));
}
}
public function __construct(){
parent::__construct();
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
$this->load->library("nuSoap_lib");
$server = new soap_server();
$this->server = $server;
$server->configureWSDL("My API", $this->http . $this->site . '/api/');
$server->schemaTargetNamespace = $this->http . $this->site . '/api/';
$server->wsdl->addComplexType(
"user",
"complexType",
"struct",
"all",
"SOAP-ENC:struct",
array(
"user" => array("name" => "user", "type" => "xsd:struct")
)
);
$server->register(
"gallery.get_user",
array(),
array("return" => "tns:user"),
"urn:GalleryWSDL",
"urn:GalleryWSDL#getUser",
"rpc",
"encoded",
"Returns the information of a certain member"
);
}
public function index(){
function get_user(){
$user = array(
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3'
);
return $user;
}
$this->server->service(file_get_contents("php://input"));
}
}
Dit is het stuk source van de CLIENT
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$soap = new SoapClient($this->http . $this->site . '/api?wsdl', array('cache_wsdl' => WSDL_CACHE_NONE));
if ($access){
$user = $soap->__call('get_user',array());
print_r($user);
}
if ($access){
$user = $soap->__call('get_user',array());
print_r($user);
}
De get_user functie is functioneel maar doet niet wat ik wil. De $user variabele die een array/object terug zou moeten krijgen, blijft helaas leeg, of geeft alleen het woord 'Array' terug.
Wie kan mij hier mee helpen?
Gewijzigd op 23/07/2014 13:33:03 door Robert Wazzaa
Geeft print_r($access); wel iets? Ik vermoed dat dit een lege array is.
Het gaat puur erom dat ik geen array terug krijg van de get_user call.
je roept bij get_user() de functie: $this->check_auth(); aan. Hier geef je geen parameters mee, kan dit? Want bij auth doe je dit wel.
Geloof me, het ligt niet aan get_user(), ik heb hier de belangrijkste source neergezet zoals het ongeveer werkt, omdat de constructie iets anders is in mijn source.
$this->check_auth(); werkt prima, echt waar.
Ik ben op zoek naar de oplossing om een array heen en weer te sturen.
Ohh, ik snap er nog steeds niet zoveel van... Je stuurt van Client naar server met $auth ook een array? Het verschil in de 2 calls zit hem wel in dat je bij de auth een array(' ' => '') mee stuurt en bij get_user array().
Kijk naar de functie get_user aan de server kant. Dit returnd een aray. Maar aan de client kant krijg ik geen array terug, enkel het woord 'Array' waar ik dus niks mee kan.
Dat is het probleem dat ik heb.
Toevoeging op 23/07/2014 13:33:23:
Ik heb zojuist het topic wat aangepast, misschien dat het nu duidelijker is.
Wat is trouwens je reden om niet de soapserver van PHP zelf te gebruiken? ( zie: php.net/soapserver )
De reden dat ik geen soapserver gebruik zonder NuSoap is omdat ik met het zelf maken van een Soap service vrij nieuw ben, en ik niet juist weet hoe ik een wsdl opbouw.
Nusoap maakt voor je de wsdl aan.
Ik zou het heel graag met 'gewoon php' willen doen, maar die kennis mis ik.
Voorbeeld:
index.php (Server)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
class Soaptest {
public function get_user(){
$user_object = new User('Robert');
$user = array(
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3',
'object' => $user_object,
);
return $user;
}
}
class User{
private $name;
public $email;
public function __construct( $name ){
$this->name = $name;
}
}
try {
$server = new SOAPServer ( null, array (
'uri' => 'http://localhost/test/',
) );
$server->setClass ( 'Soaptest' );
$server->handle ();
}
catch ( SOAPFault $f ) {
print $f->faultstring;
}
?>
class Soaptest {
public function get_user(){
$user_object = new User('Robert');
$user = array(
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3',
'object' => $user_object,
);
return $user;
}
}
class User{
private $name;
public $email;
public function __construct( $name ){
$this->name = $name;
}
}
try {
$server = new SOAPServer ( null, array (
'uri' => 'http://localhost/test/',
) );
$server->setClass ( 'Soaptest' );
$server->handle ();
}
catch ( SOAPFault $f ) {
print $f->faultstring;
}
?>
client.php (client)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class User{
private $name;
public $email;
public function __construct( $name ){
$this->name = $name;
}
}
$client = new SoapClient ( null, array (
'location' => "http://localhost/test/",
'uri' => "http://localhost/test/",
'trace' => 1
) );
$return = $client->__call('get_user',array());
echo '<pre>';
print_r($return);
echo $return['object']->name;
?>
class User{
private $name;
public $email;
public function __construct( $name ){
$this->name = $name;
}
}
$client = new SoapClient ( null, array (
'location' => "http://localhost/test/",
'uri' => "http://localhost/test/",
'trace' => 1
) );
$return = $client->__call('get_user',array());
echo '<pre>';
print_r($return);
echo $return['object']->name;
?>
Gewijzigd op 23/07/2014 14:56:59 door TJVB tvb
Die optie heb ik inderdaad ook overwogen, het enige nadeel daarvan vind ik dat voor een gebruiker van de API, niet automatisch zichtbaar is hoe de functies, variabelen e.d. zichtbaar zijn. Of is dit net zoals met een wsdl wel mogelijk?
Bijvoorbeeld: https://github.com/piotrooo/wsdl-creator/
Okeej dankje! Ik ga eens kijken of het op die manier wel lukt!