Soap API met NuSoap werkt niet zoals gewenst

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Wazzaa

Robert Wazzaa

23/07/2014 10:23:50
Quote Anchor link
Beste Iedereen,

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)
PHP script in nieuw venster Selecteer het PHP script
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
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"));

    }

}


Dit is het stuk source van de CLIENT
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}


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
 
PHP hulp

PHP hulp

29/03/2024 06:27:18
 
Michiel Duck

Michiel Duck

23/07/2014 12:23:52
Quote Anchor link
Geeft print_r($access); wel iets? Ik vermoed dat dit een lege array is.
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 12:27:32
Quote Anchor link
$access gaat prima, dit geeft een true terug, zoals ik aangaf werkt de 'auth' call gewoon prima.
Het gaat puur erom dat ik geen array terug krijg van de get_user call.
 
Michiel Duck

Michiel Duck

23/07/2014 13:00:30
Quote Anchor link
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.
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 13:09:23
Quote Anchor link
Beste Michiel,

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.
 
Michiel Duck

Michiel Duck

23/07/2014 13:26:34
Quote Anchor link
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().
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 13:32:15
Quote Anchor link
Je blijft kijken naar die Auth, dit is het probleem niet.
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.
 
TJVB tvb

TJVB tvb

23/07/2014 14:26:53
Quote Anchor link
Is dit ook daadwerkelijk de code zoals je die nu hebt?

Wat is trouwens je reden om niet de soapserver van PHP zelf te gebruiken? ( zie: php.net/soapserver )
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 14:28:35
Quote Anchor link
Nee de code is ietsjes anders,
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.
 
TJVB tvb

TJVB tvb

23/07/2014 14:56:01
Quote Anchor link
Als je geen gebruik wilt maken van een wsdl kan dat ook met de SOAPServer class van php.

Voorbeeld:
index.php (Server)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>


client.php (client)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
Gewijzigd op 23/07/2014 14:56:59 door TJVB tvb
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 14:59:44
Quote Anchor link
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?
 
TJVB tvb

TJVB tvb

23/07/2014 15:31:53
Quote Anchor link
Dat zit er helaas nog niet in, maar er zijn wel losse pakketten die dat voor je kunnen.
Bijvoorbeeld: https://github.com/piotrooo/wsdl-creator/
 
Robert Wazzaa

Robert Wazzaa

23/07/2014 15:37:16
Quote Anchor link
Okeej dankje! Ik ga eens kijken of het op die manier wel lukt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.