[PHP SOAP]Waarde uit response soap-header krijgen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Ik probeer een script te schrijven voor het gebruik van een webservice, voor de betreffende webservice moet eerst ingelogd worden en bij een succesvolle inlog word er een session id teruggegven, deze session kun je weer gebruiken voor de rest van de functies.
Allemaal redelijk standaard dus, het probleem zit hem in de locatie van de session_id in de loginresponse. Begin van de response:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<Header xmlns="http://www.xxxxxx.xxx/">
<SessionID>2e236a67-f6d2-4cdd-a7cc-750b427bb15b</SessionID>
</Header>
[...]


De enigste methode die ik heb om headers uit de response te filteren, is het uitvoeren van een __getLastResponseHeaders(), maar deze geeft de HTTP headers terug:
code:
1
2
3
4
5
6
7
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 549
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Date: Mon, 19 Apr 2010 09:00:50 GMT

Overgebleven oplossing is het zelf parsen van de response (m.b.v. xml_parse()), maar dit wil ik alleen als laatste redmiddel gebruiken aangezien dit mijn inziens een beetje voorbij gaat aan het "Simple" gedeelte van SOAP.

Zie ik iets over het hoofd?

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 09-09 15:21
offtopic:
Dit was dus onzin

[ Voor 88% gewijzigd door dev10 op 19-04-2010 12:02 ]


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:18

Dido

heforshe

Die "Header" die jij terug wilt krijgen is natuurlijk geen SOAP header. Dat ding had net zo goed Piet kunnen heten, dus dat je met __getLastResponseHeaders() niet jouw elements terugkrijgt die je toevallig ook header genoemd hebt is niet zo heel gek.

edit: je soap:Header wordt in je voorbeeld niet afgesloten. Ik las hem daardoor als een leeg element, maar waarschijnlijk bedoel je dat jouw header in de soap:header staat.

Waarom is het zelf parsen van je response zo'n probleem? Je respons is immers applicatiespecifiek, dus ik vermoed dat er geen standaardfuncties zijn om jouw Header/SessionID uit de soap:Header content te vissen.

e.e.a. onder groot voorbehoud dat ik weinig tot niets van PHP weet, dus ik kan er gigantisch naast zitten, natuurlijk :P

[ Voor 12% gewijzigd door Dido op 19-04-2010 12:12 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Arie-
  • Registratie: December 2008
  • Niet online
Soap header != http header

edit: Beetje traag, iets teveel tabs open.

[ Voor 46% gewijzigd door Arie- op 19-04-2010 12:13 ]


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Voor de duidelijkheid, het is niet mijn implementatie, maar die van de webservice die ik tracht te gebruiken. De <soap:Header> tag word netjes afgesloten, dus dit is mijn inziens niet het probleem.

Die SoapClient: Documentatie
Response is inderdaad applicatie specifiek, maar hiervan maakt de PHP class SoapClient ook gebruik, het gaat hier dus over wat ik in de <soap:Header> terug krijg.

Ik maak juist gebruik van de SoapClient class om zelf niet elke response te hoeven parsen, dit is normaliter ook geen probleem, omdat alle antwoorden dan netjes in de <body> van de response staan.

Arie: Dat is mij duidelijk, maar als je op een SoapClient class de methode __getLastResponseHeaders() aanroept dan verwacht ik de SOAP headers, niet de HTTP headers.

[ Voor 5% gewijzigd door CRiMiNaL op 19-04-2010 12:48 ]

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 13:08

MueR

Admin Tweakers Discord

is niet lief

Soap headers zijn in basis http headers. Het element dat ze toevallig "header" hebben genoemd bevindt zich in de body van de soap response. Of ze het nu Header, Pietje of Bier noemen, het blijft een gewoon soap element in de body.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Dit is niet het geval, nogmaals de response:
XML:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<Header xmlns="http://www.xxxxx.xxx/">
<SessionID>123258a1-794b-462b-b1af-c32dbc5bcec7</SessionID>
</Header>
</soap:Header>
<soap:Body>
[...]
</soap:Body>

zoals je ziet staat de SessionID in de soap:Header, niet in de soap:Body

[ Voor 7% gewijzigd door CRiMiNaL op 19-04-2010 12:51 ]

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:55

Creepy

Tactical Espionage Splatterer

http://php.net/manual/en/...etlastresponseheaders.php
Note: This function only works if the SoapClient object was created with the trace option set to TRUE.
Dus heb je de trace option op true staan?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Creepy schreef op maandag 19 april 2010 @ 12:50:
[...]

Dus heb je de trace option op true staan?
Klopt, stuk code
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$client = new SoapClient("https://xxxxxx.xxx?wsdl", array('trace' => true));

$params = array( "user" => $user,
                     "password" => $pass,
                     "organisation" => $env,
                     "nextAction" => "",
                     "cluster" => "");                     
$loginRes = $client->Logon($params);
if($loginRes->LogonResult == "Ok") {
   var_dump($client->__getLastResponseHeaders());
         $response = $client->__getLastResponse();         
         var_dump($response);
}


De login is succesvol, dan dumpt hij de headers (die zijn zoals ik gepost heb in mijn startpost.

[ Voor 9% gewijzigd door CRiMiNaL op 19-04-2010 12:54 ]

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:55

Creepy

Tactical Espionage Splatterer

En hoe check je die headers? Als je dat via je browser doet zul je niet zoveel zien omdat tags die geen HTML zijn gewoon niet worden getoond. Als je de source bekijkt dan bestaat de kans dat je wel ziet wat je verwacht.

Oftewel: Let even op de hoeveelheid informatie die je geeft, je laat nogal wat belangrijke info achterwege ;)

[ Voor 9% gewijzigd door Creepy op 19-04-2010 13:14 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Creepy schreef op maandag 19 april 2010 @ 13:07:
En hoe check je die headers? Als je dat via je browser doet zul je niet zoveel zien. Als je de source bekijkt dan bestaat de kans dat je wel ziet wat je verwacht.

Oftewel: Let even op de hoeveelheid informatie die je geeft, je laat nogal wat belangrijke info achterwege ;)
Ik begrijp je totaal niet, ik laat in mijn post hierboven toch duidelijk zien dat ik een var_dump($client->__getLastResponseHeaders()) doe? Zelfs in de TS geef ik al aan dat ik dit doe, alleen heb ik toen verzuimd code bij te voegen.

Maargoed, aangezien het er op lijkt dat er geen andere oplossing is, ga ik het als volgt oplossen:
PHP:
1
2
3
$qq = new domDocument();
$qq->loadXML($client->__getLastResponse());
$sessionID = $qq->getElementsByTagName('SessionID')->item(0)->textContent;

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:18

Dido

heforshe

Maar je gebruikt dus een debug-optie om standaard je gegevens te krijgen? Is dat wel zo verstandig?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Dido schreef op maandag 19 april 2010 @ 14:01:
Maar je gebruikt dus een debug-optie om standaard je gegevens te krijgen? Is dat wel zo verstandig?
Klopt en het is inderdaad niet verstandig, zoals in de TS aangegeven heeft het ook niet mijn voorkeur.
Het lijkt er sterk op dat er geen andere manier is om deze waarde uit de response te verkrijgen dan het (zelf her-)parsen van de complete respons. Komt nog bij dat de domDocument::loadXML methode behoorlijk resources vreet bij grotere XML documenten.

[ Voor 5% gewijzigd door CRiMiNaL op 19-04-2010 14:22 ]

... MMORPG Addict.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:55

Creepy

Tactical Espionage Splatterer

CRiMiNaL schreef op maandag 19 april 2010 @ 13:15:
[...]

Ik begrijp je totaal niet, ik laat in mijn post hierboven toch duidelijk zien dat ik een var_dump($client->__getLastResponseHeaders()) doe? Zelfs in de TS geef ik al aan dat ik dit doe, alleen heb ik toen verzuimd code bij te voegen.
Ik zie dat je dat doet ja, maar je verteld niet op welke manier je die data bekijkt. Als je dat vanuit een browser doet dan kan het zijn dat de soap TAGS *NIET* worden getoond, die verbergt de browser namelijk. Als je vervolgens in je browser de pagina-bron bekijkt dan zie je ze wel. Dus hoe bekijk jij die data nu precies en weet je dus 100% zeker dat die soap header er echt niet uit komt?

[ Voor 4% gewijzigd door Creepy op 19-04-2010 17:36 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
De output zoals in de TS gegeven is de exacte output, var_dump gooit zelf al een htmlentities() over de output, wat de tags ook in de browser al zichtbaar zou maken als die er waren geweest.
Volgens mij komt dit door xdebug's var_dump override, aangezien ik twijfel of de standaard var_dump dit ook doet.

... MMORPG Addict.

Pagina: 1