PHP + via SOAP XML Uitlezen -> Bad Request

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Digital-DNA
  • Registratie: Juli 2000
  • Laatst online: 05-09 14:03

Digital-DNA

Gedigitaliseerd tot op het bot

Topicstarter
Ik probeer met PHP via SOAP gegevens uit te lezen van de volgende server:
http://etalage.otib.nl/service/EtalageService.asmx

WSDL:
http://etalage.otib.nl/service/EtalageService.asmx?WSDL

Het kan ook via HTTP POST en GET, maar aangezien je ingelogd moet zijn lukt het me niet op die manier. Ik probeer nu GeefClustersPerCategorie uit te voeren en dan 'sanitair' uit te lezen.

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
<?php
$request = '
POST /service/EtalageService.asmx HTTP/1.1
Host: etalage.otib.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 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>
    <GeefClustersPerCategorie xmlns="http://etalage.otib.nl/">
      <categorie>sanitair</categorie>
    </GeefClustersPerCategorie>
  </soap12:Body>
</soap12:Envelope>';

class LocalSoapClient extends SoapClient {

  function __construct($wsdl, $options) {
    parent::__construct($wsdl, $options);
    $this->server = new SoapServer($wsdl, $options);
  }

  function __doRequest($request, $location, $action, $version, $one_way = 0) {
    ob_start();
    $this->server->handle($request);
    $response = ob_get_contents();
    ob_end_clean();
    return $response;
  }

}
$x = new LocalSoapClient('http://etalage.otib.nl/service/EtalageService.asmx?WSDL',  array('username' => '********', 'password' => '**********'));
$x->__doRequest($request, 'http://etalage.otib.nl','http://etalage.otib.nl/GeefClustersPerCategorie', SOAP_1_2);
?>

Je kan een taal toevoegen aan de [code=php] tag ;)

(Uiteraard) werkt het niet:

code:
1
2
3
4
5
6
7
8
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Bad Request</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Ik zal ongetwijfeld iets fout doen, maar ik ben nogal noob op dit gebied en ik ben de hele dag al wezen prutsen. In de link bovenaan staan ook de benodigde envelopes e.d.

De weinig onthullende foutmelding helpt mij ook niet echt. Zou iemand er eens naar willen kijken? Bedankt!

[ Voor 1% gewijzigd door BtM909 op 02-02-2012 17:32 ]

www.nintendocasemods.com


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom ben je in hemelsnaam die $request-string aan 't bouwen :? Daar heb je toch nou net die SoapClient voor :?

Heb je zoiets al geprobeerd en hier al eens overheen gekeken? Of, doe eens gek, hier doorheen gekeken?

[ Voor 65% gewijzigd door RobIII op 02-02-2012 17:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Digital-DNA
  • Registratie: Juli 2000
  • Laatst online: 05-09 14:03

Digital-DNA

Gedigitaliseerd tot op het bot

Topicstarter
Ik doe de hele dag al niks anders dan spul lezen over dit onderwerp, maar het wordt er niet duidelijker op eerlijk gezegd (overal halve voorbeelden, onduidelijke en inconsistente uitleg, uitgaan van bepaalde voorkennis enzo, je kent het wel).

Ik had geprobeerd de laatste zin te vervangen met:
$x->GeefClustersPerCategorie(array('categorie' => 'sanitair'));

Maar dan zegt de server dat de functie niet bestaat.

Als iemand me een beetje op weg zou willen helpen zou mijn dank grootsch zijn.

www.nintendocasemods.com


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik vermoed dat 't zoiets moet zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
ini_set('soap.wsdl_cache_enabled', 1);
$options = array(
    'soap_version' => SOAP_1_2,
    'trace'      => true,
    'exceptions' => true,                
    'encoding' => 'UTF-8',
    'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
    'cache_wsdl' => WSDL_CACHE_DISK,
    'login' => 'username',     // <- username hier!
    'password' => 'password',  // <- wachtwoord hier!
    );
$client = new SoapClient('http://etalage.otib.nl/service/EtalageService.asmx?WSDL', $options);
$client->GeefClustersPerCategorie(array('categorie' => 'sanitair'));

Ik zou 't graag testen maar ik heb geen login gegevens :Y)

[ Voor 3% gewijzigd door RobIII op 02-02-2012 22:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Digital-DNA
  • Registratie: Juli 2000
  • Laatst online: 05-09 14:03

Digital-DNA

Gedigitaliseerd tot op het bot

Topicstarter
Met je aanpassingen heb ik 't aan de praat hoor! _/-\o_

Het werkte eerst nog niet omdat inloggen niet goed ging. Ik had daarom eerst de speciale Login-method gebruikt: $client->Login(array('username' => '***', 'password' => '***')); en daarna die andere voor het opvragen van de gegevens.

Ik kreeg een xml-string in een object in een object zeg maar. Die string had ik met simplexml_load_string() weer omgezet in een los object en via een andere speciale functie kon ik hier vervolgens een leesbare array uit toveren.

Kan ik toch nog rustig slapen :z

_/-\o_ Bedankt! _/-\o_

www.nintendocasemods.com


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Digital-DNA schreef op vrijdag 03 februari 2012 @ 00:25:
Het werkte eerst nog niet omdat inloggen niet goed ging. Ik had daarom eerst de speciale Login-method gebruikt: $client->Login(array('username' => '***', 'password' => '***')); en daarna die andere voor het opvragen van de gegevens.
Hoe werkt die tweede call dan? Krijg je een sessie oid terug van die Login method? Uit je WSDL haal ik alleen dat er een bool wordt teruggeven volgens mij :? Ik vind 't maar een rare manier van werken; die interface die ze bieden is iig niet zoals het hoort IMHO.
Digital-DNA schreef op vrijdag 03 februari 2012 @ 00:25:
Ik kreeg een xml-string in een object in een object zeg maar. Die string had ik met simplexml_load_string() weer omgezet in een los object en via een andere speciale functie kon ik hier vervolgens een leesbare array uit toveren.
Hebben we 't nou over de situatie voor mijn post of na mijn post :? Je zou helemaal geen XML moeten krijgen maar gewoon een GeefClustersPerCategorieResult object oid.

PHP:
1
2
3
4
$result = $client->GeefClustersPerCategorie(
                        array('categorie' => 'sanitair')
                    )->GeefClustersPerCategorieResult; 
var_dump($result);


Dat zou een boel duidelijk moeten maken. Je hoeft feitelijk nooit met XML te rommelen als het goed is. Als die call een string teruggeeft waar XML in gefrot zit hebben ze 't niet helemaal begrepen daar...

[ Voor 9% gewijzigd door RobIII op 03-02-2012 00:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Digital-DNA
  • Registratie: Juli 2000
  • Laatst online: 05-09 14:03

Digital-DNA

Gedigitaliseerd tot op het bot

Topicstarter
Tja met vardump krijg je dit (xml even ingekort):

code:
1
2
3
4
object(stdClass)#3 (1) {
  ["any"]=>
  string(1656) "<EtalageDataSet xmlns=""><xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:sche... () ...mer></svcGeefClustersOpCategorie></EtalageDataSet>"
}


Ik heb de $client->Login en $client->GeefClusterPerCategorie-regel recht onder elkaar staan en dat werkt blijkbaar, ik heb geen sessies aanstaan oid. Beetje vaag idd.

Naja ik ben blij dat ik iets heb waar ik mee uit de voeten kan.

www.nintendocasemods.com

Pagina: 1