[php] soap client class uitbreiden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een soapserver opgezet en er komen wat clients die er mee gaan communiceren. Deze clients zijn identiek, alleen kunnen er wat specifieke gevallen voordoen:

1) normale server - client configuratie
2) de client staat op dezelfde machine als de server
3) de server is niet bereikbaar (client offline)

In het eerste geval doe ik gewoon soap, dat werkt prima. Dat werkt ook in het tweede geval, alleen nu heb ik de mogelijkheid de functies van de server direct aan te spreken door gewoon de server te includen. In het derde geval wil ik de requests lezen en schrijven naar de schijf (als er info op aanwezig is iig)

Aangezien ik de clients identiek wil houden wil ik dus dat ie zelf uitvogelt in welke situatie hij zit. Eerste gedachten was om de __soapCall() method van de client uitbreiden. Ik dacht namelijk dat deze impliciet aangeroepen wordt, maar dat lijkt niet het geval te zijn

Wat ik wel kan doen is de __doRequest() uitbreiden. Probleem hierbij is dat de request parameter ervan de hele xml request string al is, en ik heb eigenlijk liever de functienaam en argumenten, zoals bij __soapCall het geval zou zijn. Ter beeldvorming:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class AdaptiveSoapClient extends SoapClient {

    function __doRequest($request, $location, $action, $version) {
        if (zelfde server) {
            include_once($serverName);
            call_user_func();
        } elseif (offline) {
            //schrijf / lees naar bestand
        } else {        //online
            return parent::__doRequest($request, $location, $action, $version);
        }
    }
}


nu moet ik dus de variabelen enzo uit die request gaan prutsen, is allemaal wel te doen, maar ik vraag me af of er betere ideeen zijn

verder staat de locatie van de server in de wsdl file, die kan ik er ook wel uitklussen, maar ook daar de vraag of ik die niet ergens handiger vandaan kan halen, zodat ik kan controleren of ie hetzelfde is als de server waar de client op draait

____________________
edit:

deze aanpak gaat denk ik toch niet werken. Wat ik nu doe is het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
class AdaptiveSoapClient extends SoapClient {
    public $online = true;

    function __construct($wsdl, $options=array()) {
        try {
            parent::__construct($wsdl, $options);
        } catch (Exception $e) {
            $this->online = false;
        }
    }
}

dat werkt, de parameter geeft keurig aan of er iets fout is gegaan en dus de service offline is. Als ik nu een remote functie aanroep (iets als $client->test('foo')), dan gaat in het online geval alles goed (duh), maar in het offline geval gaat het fout. Hij komt dan namelijk niet eens bij die __doRequest, aangezien de remote method "test()" lokaal niet is aangemaakt, resultaat: een error.

Hoe vang ik nu binnen die client op dat er een niet bestaande method wordt aangeroepen? Als dat namelijk het geval is wil ik een andere actie doen (lezen uit bestand)

[ Voor 19% gewijzigd door Verwijderd op 22-05-2006 14:55 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik weet niet of dit helemaal is wat je bedoelt maar ik zou het zo doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
class A extends SoapClient {
    
    public function __construct($wsdl, $options=array()) {
        try {
            parent::__construct($wsdl, $options);
        } catch (Exception $e) {
            $this->online = false;
        }
    } 
    
    public function test_local() {
        return "test_local";
    }
}

$a = new A("http://localhost");
$r = new ReflectionClass("A");
$t = $r->hasMethod("test") ? $a->test() : $a->test_local();
echo $t;
?>


of zo:

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
<?
class OnlineClient extends SoapClient {
    
    public $online = false;
    
    public function __construct($wsdl, $options=array()) {
        try {
            parent::__construct($wsdl, $options);
            $this->online = true;
        } catch (Exception $e) {}
    } 
    
    public function test() {
        return parent::test();
    }
}
class OfflineClient {
        
    public function test() {
        return "test_local";
    }
}

$a = new OnlineClient("http://meneer2");
if(!$a->online) $a = new OfflineClient;
$t = $a->test();
echo $t;
?>


of je zet lokaal een ook server neer:

PHP:
1
2
3
4
5
6
<?
$a = new Client("http://remotehost");
if(!$a->online) $a = new Client("http://localhost");
$t = $a->test();
echo $t;
?>

[ Voor 52% gewijzigd door Genoil op 22-05-2006 20:02 ]