[PHP/SOAP] aanspreken soap server vanuit php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik ben al een tijdje bezig met het aanspreken van een soap server. Het inloggen lukt, alleen lukt het uitloggen niet.

Dit is de request en response van de login:

code:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Login xmlns="http://www.server.com/">
      <userName>string</userName>
      <password>string</password>
    </Login>
  </soap12:Body>
</soap12:Envelope>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <SessionIDHeader xmlns="http://www.server.com/">
      <SessionID>string</SessionID>
    </SessionIDHeader>
  </soap12:Header>
  <soap12:Body>
    <LoginResponse xmlns="http://www.server.com/">
      <LoginResult>
        <Message>string</Message>
        <Status>None or Success or Failed or SuccessWithErrors</Status>
      </LoginResult>
    </LoginResponse>
  </soap12:Body>
</soap12:Envelope>


Ik log in via volgend script:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

class Login {
    public $userName; 
    public $password; 
} 

$login = new Login(); 
$login->userName = 'username'; 
$login->password = 'password'; 

$client = new SoapClient("http://www.server.com/file.asmx?WSDL", array('trace' => true, 'soap_version' => SOAP_1_2, 'location" => "http://www.server.com/')); 
$result = $client->Login($login);

echo $client->__getLastResponse(); 

?>


Ik krijg dan zoals het hoort de sessionid terug die ik dan moet gaan gebruiken met volgende scripts
Maar het lukt me niet uit te loggen.

Dit is de request en response van de logout:

code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <SessionIDHeader xmlns="http://www.server.com/">
      <SessionID>string</SessionID>
    </SessionIDHeader>
  </soap12:Header>
  <soap12:Body>
    <Logout xmlns="http://www.server.com/" />
  </soap12:Body>
</soap12:Envelope>


code:
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <LogoutResponse xmlns="http://www.server.com/" />
  </soap12:Body>
</soap12:Envelope>


Mijn PHP code is de volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php 

$ns = 'http://www.server.com/file.asmx?WSdL'; 
$SessionID = 'sessionid';

$headerbody = array('SessionID' => $SessionID); 
      
$header = new SOAPHeader($ns, 'SessionIDHeader', $headerbody);        
        
$soap_client->__setSoapHeaders($header); 

?>


Hiermee zet ik dus de sessionid in de headers, maar ik moet hem ook duidelijk maken dat ik wil uitloggen. Dit moet via de body, alleen weet ik niet hoe.

Is er iemand die me hiermee op weg kan helpen?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
wat is de gedachte achter deze methode?

Authenticatie is goed, maar over het algemeen is het login/loguit niet echt van toepassing bij soapconnecties.

is het niet makkelijker om een soort van authenticatie te maken met een token? gebruikergegevens sturen en vervolgens bij succes een token terugsturen, die dan gebruikt kan worden om verdere request te authenticeren? je zou dan bij kunnen houden wanneer de tokens gebruikt worden, met een timeout de token invalid maken..?

[ Voor 51% gewijzigd door steffex op 17-03-2010 19:44 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11-09 16:33

Haan

dotnetter

Ik heb ook nog niet eerder gehoord dat je zou moeten uitloggen na gebruik van SOAP services. Inloggen moet je wel eens doen. Heb je zelf die logout bedacht, of is het een webservice van een andere partij die je aan wil roepen?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de reacties.

Ik heb weinig inspraak in de manier van communicatie. Ik moet uitloggen via soap, die logout heb ik niet zelf bedacht. Het is dus inderdaad een webservice van een externe partij.

De manier waarop die logout werkt werkt ook voor de andere functies, zo is er bvb een creditcheck die nakijkt hoeveel geld er nog op je account staat. Maar dat lukt me ook niet omdat ik die op een of andere wijze moet kunnen zeggen aan de soap server welke info ik wil.

Dit is bvb de request responce om mijn balance na te kijken:

code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <SessionIDHeader xmlns="http://www.server.com/">
      <SessionID>string</SessionID>
    </SessionIDHeader>
  </soap12:Header>
  <soap12:Body>
    <CreditRemaining xmlns="http://www.server.com/" />
  </soap12:Body>
</soap12:Envelope>


code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CreditRemainingResponse xmlns="http://www.server.com/">
      <CreditRemainingResult>
        <Credit>int</Credit>
      </CreditRemainingResult>
    </CreditRemainingResponse>
  </soap12:Body>
</soap12:Envelope>


Lijkt dus erg op logout, alleen is het hier CreditRemaining ipv Logout. Maar ik heb geen idee hoe je dit moet aangeven aan de soap server en geraak er niet aan uit.

De externe partij heeft alleen een C++ voorbeeld, waar ik niet veel wijzer uit wordt.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11-09 16:33

Haan

dotnetter

De SOAP xml die verstuurd wordt, zou gelijk moeten zijn, onafhankelijk van welke taal je gebruikt voor het versturen van je request.

Maar wat werkt er niet aan de request om bijv. je balance na te kijken? Zo te zien zou die wel moeten kunnen werken. Krijg je wel iets van een response terug?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Neen, ik krijg helemaal niets terug indien ik mijn logout script aanroep. Zelfs geen foutmelding. Bij het inloggen gaat het goed en krijg ik mijn sessionid terug.

Ik moet de server toch zeggen dat het om balance of logout gaat? Ik geraak er niet aan uit hoe ik hem dat moet zeggen. SessionID wordt goed doorgegeven volgens mij (zie scripts boven), maar er mist nog iets vermoed ik.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11-09 16:33

Haan

dotnetter

In de Soap:Body geef je toch aan of je een Logout, of CreditRemaining actie wilt uitvoeren? Je zal toch wel iets van een response terug moeten krijgen, al was het maar een 400 Bad Request of 500 Internal server error o.i.d.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Neen, dat vraag ik nu net ;)
Hoe moet ik dit in de body opgeven? Mijn script is nu de volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php 

$ns = 'http://www.server.com/file.asmx?WSdL'; 
$SessionID = 'sessionid';

$headerbody = array('SessionID' => $SessionID); 
      
$header = new SOAPHeader($ns, 'SessionIDHeader', $headerbody);        
        
$soap_client->__setSoapHeaders($header); 

?>


En deze geeft helemaal niets terug

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11-09 16:33

Haan

dotnetter

Ik ken verder geen PHP, maar ik zou verwachten dat je iets als $result = $client->CreditRemaining (zoals je in de startpost de Login methode ook aanroept) moet doen. In de header zet je alleen je sessionID.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 21:40
Het is alweer een kleine anderhalf jaar geleden dat ik voor het laatst iets met PHP en SOAP deed, maar toendertijd had ik een vergelijkbaar probleem. Uiteindelijk was de aanroep aanpassen de oplossing voor mij, zie deze entry - wellicht dat het helpt :)

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1