[PHP, XML, SOAP] Gegevens ontvangen en verwerken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,

Momenteel ben ik bezig met een website die een bepaald aanbod moet ophalen bij een externe partij.

van de externe partij (een bedrijf dat webbased applicaties maakt) heb ik een zeer beperkte documentatie gekregen.

op de php pagina waar ik de informatie wil laten verwerken heb ik dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MijnAanbod {
    public $kantoorID;
    public $userName;
    public $passWord;
}

$aanbod = new MijnAanbod();
$aanbod->kantoorID = 1234;
$aanbod->userName = 'user';
$aanbod->passWord = '****';

$client = new SoapClient("http://websiteleverancier.nl/pagina.asmx?WSDL", array('trace' => true, 'soap_version' => SOAP_1_2));
$result = $client->MijnAanbod($aanbod);
            
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";


Als uitkomst krijg ik:

REQUEST: 1234user****

Dat is natuurlijk niet de bedoeling, we willen nl. het aanbod bovenwater krijgen.

tevens zit er bij de 'documentatie' nog het volgende:

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
OST /websiteleverancier.nl/pagina.asmx HTTP/1.1
Host: ws1.vbo.nl
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 500

<?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>
    <MijnAanbod xmlns="http://websiteleverancier.nl/">
      <kantoorID>int</kantoorID>
      <userName>string</userName>
      <passWord>string</passWord>
    </MijnAanbod>
  </soap12:Body>
</soap12:Envelope>

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 500

<?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>
    <MijnAanbodResponse xmlns="http://websiteleverancier.nl/">
      <MijnAanbodResult>
        <xsd:schema>schema</xsd:schema>xml</MijnAanbodResult>
    </MijnAanbodResponse>
  </soap12:Body>
</soap12:Envelope>


Ik heb geen idee hoe ik dit moet toepassen en wat er er uberhoupt mee moet doen!

als ik trouwens http://websiteleverancier.nl/pagina.asmx?WSDL aanroep gewoon in FF krijg ik het volgende retour:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<wsdl:definitions targetNamespace="http://websiteleverancier.nl/">
    <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://websiteleverancier.nl/">
            <s:element name="Version">
                <s:complexType/>
            </s:element>
            <s:element name="VersionResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" name="VersionResult" type="s:string"/>
                    </s:sequence>
                </s:complexType>
            </s:element>

            <s:element name="MijnAanbod">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="1" maxOccurs="1" name="kantoorID" type="s:int"/>
                        <s:element minOccurs="0" maxOccurs="1" name="userName" type="s:string"/>
                        <s:element minOccurs="0" maxOccurs="1" name="passWord" type="s:string"/>
                    </s:sequence>
                </s:complexType>
            </s:element>
            
            <s:element name="MijnAanbodResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" name="MijnAanbodResult">
                            <s:complexType>
                                <s:sequence>
                                    <s:element ref="s:schema"/>
                                    <s:any/>
                                </s:sequence>
                            </s:complexType>
                        </s:element>
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
    </wsdl:types>

    <wsdl:message name="VersionSoapIn">
        <wsdl:part name="parameters" element="tns:Version"/>
    </wsdl:message>

    <wsdl:message name="VersionSoapOut">
        <wsdl:part name="parameters" element="tns:VersionResponse"/>
    </wsdl:message>

    <wsdl:message name="MijnAanbodSoapIn">
        <wsdl:part name="parameters" element="tns:MijnAanbod"/>
    </wsdl:message>

    <wsdl:message name="MijnAanbodSoapOut">
        <wsdl:part name="parameters" element="tns:MijnAanbodResponse"/>
    </wsdl:message>

    <wsdl:portType name="BedrijfsSoap">
        <wsdl:operation name="Version">
            <wsdl:input message="tns:VersionSoapIn"/>
            <wsdl:output message="tns:VersionSoapOut"/>
        </wsdl:operation>

        <wsdl:operation name="MijnAanbod">
            <wsdl:input message="tns:MijnAanbodSoapIn"/>
            <wsdl:output message="tns:MijnAanbodSoapOut"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="BedrijfsSoap" type="tns:BedrijfsSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="Version">
                <soap:operation soapAction="http://websiteleverancier.nl/Version" style="document"/>
                <wsdl:input>
                    <soap:body use="literal"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal"/>
                </wsdl:output>
            </wsdl:operation>

            <wsdl:operation name="MijnAanbod">
            <soap:operation soapAction="http://websiteleverancier.nl/MijnAanbod" style="document"/>
                <wsdl:input>
                    <soap:body use="literal"/>
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal"/>
                </wsdl:output>
            </wsdl:operation>
            </wsdl:binding>

            <wsdl:binding name="BedrijfsSoap12" type="tns:BedrijfsSoap">
                <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
                    <wsdl:operation name="Version">
                        <soap12:operation soapAction="http://websiteleverancier.nl/Version" style="document"/>
                        <wsdl:input>
                            <soap12:body use="literal"/>
                        </wsdl:input>
                        <wsdl:output>
                            <soap12:body use="literal"/>
                        </wsdl:output>
                    </wsdl:operation>
                    <wsdl:operation name="MijnAanbod">
                    <soap12:operation soapAction="http://websiteleverancier.nl/MijnAanbod" style="document"/>
                        <wsdl:input>
                            <soap12:body use="literal"/>
                        </wsdl:input>
                        <wsdl:output>
                            <soap12:body use="literal"/>
                        </wsdl:output>
                    </wsdl:operation>
                </wsdl:binding>
            <wsdl:service name="Bedrijfs">
            
            <wsdl:port name="BedrijfsSoap" binding="tns:BedrijfsSoap">
                <soap:address location="http://websiteleverancier.nl/Pagina.asmx"/>
            </wsdl:port>
            <wsdl:port name="BedrijfsSoap12" binding="tns:BedrijfsSoap12">
                <soap12:address location="http://websiteleverancier.nl/pagina.asmx"/>
            </wsdl:port>
        </wsdl:service>
    </wsdl:definitions>


Kan iemand mij een voorzetje geven zodat ik alle gegevens kan ontvangen en in mijn MySQL database kan zetten?

[ Voor 3% gewijzigd door Verwijderd op 22-08-2008 16:41 ]


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Moet je niet getLastResponse() gebruiken voor het antwoord?

[ Voor 12% gewijzigd door Icelus op 22-08-2008 16:41 ]

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Of gewoon iets met $result doen? 8)7

{signature}


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Of MijnAanbodResponse?

Maar wat Voutloos zegt is ietwat voor de hand liggender ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
quote: Door: Icelus
getLastResponse()
Zie php.net docs

[ Voor 12% gewijzigd door r0bert op 22-08-2008 16:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt tot zo ver, zowel bij:

PHP:
1
print_r($result);


als bij

PHP:
1
echo $client->__getLastResponse();


krijg ik een uitkomst. Maar de grote hamvraag voor mij is nu, hoe verwerk ik het?

In de browser zie ik alleen maar tekst die er in staat. In de broncode zie ik ook de struktuur:

PHP:
1
2
3
4
5
<?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".........

<xs:element name="DatumGewijzigd" type="xs:dateTime" minOccurs="0" />............

<DatumGewijzigd>2008-07-02T16:11:07.22+02:00</DatumGewijzigd>..............


Hoe krijg ik het nu mooi in een variabele zodat ik het een mysql db in kan pompen?

ik ben nu een aantal uur aan het zoeken maar ik kan niet vinden wat ik zoek. Zelf heb ik het idee dat ik iets van deze aart moet hebben:

PHP:
1
$DatumGewijzigd=$result['DatumGewijzigd'];


Dat wil hij niet doen. Waar schijnlijk doe ik het dan verkeerd. Is het mogelijk om iets dergelijks er uit te vissen?

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Iets van
PHP:
1
$DatumGewijzigd->$result['DatumGewijzigd'];

Maar goed, ook dat staat volgens mij prima in de diverse documentatie. Een Webservice 'consume' je over het algemeen.

'dat wil hij niet doen' is nu niet echt een duidelijke foutmelding he.

[ Voor 19% gewijzigd door TeeDee op 25-08-2008 16:42 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is de error die ik krijg:

Fatal error: Cannot use object of type stdClass as array in...

dit is de code die ik tot nu toe heb.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MijnAanbod {
    public $kantoorID;
    public $userName;
    public $passWord;
}

$aanbod = new MijnAanbod();
$aanbod->kantoorID = 1234;
$aanbod->userName = 'user';
$aanbod->passWord = '*****';

$client = new SoapClient("http://websiteleverancier.nl/pagina.asmx?WSDL", array('trace' => true));
$result = $client->MijnAanbod($aanbod);
            
$DatumGewijzigd->$result['DatumGewijzigd']; 
echo $DatumGewijzigd;


de error doet zich dan voor in de regel: 15. Waarschijnlijk moet ik het hele zootje door een functie zoals simplexml_load_file() halen. Ik kan alleen nergens vinden welke ik in dit geval moet nemen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Pak gewoon eens een tutorial voor het lezen van xml in PHP 5 erbij? :?

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Zo te zien wil je verbinding maken met Effector van VBO. Ik gebruik hiervoor de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
$client = new SoapClient('http://ws1.vbo.nl/EffectOnTheWeb/Makelaar.asmx?WSDL', array('soap_version'=>SOAP_1_1,'trace'=>1));

$result = $client->MijnAanbod(array('kantoorID'=>1234, 'userName'=>'Gebruikersnaam', 'passWord'=>'Wachtwoord'), array('soapaction' => 'http://ws1.vbo.nl/EffectOnTheWeb/MijnAanbod'));


$xmlObj    = new XmlToArray($result->MijnAanbodResult->any);
$arrayData = $xmlObj->createArray();

$objects = $arrayData['diffgr:diffgram']['dsAanbodMakelaar'][0]['Pand'];


Hierbij gebruik ik de class XmlToArray om XML om te zetten naar een array:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class XmlToArray
{
   
    var $xml='';
   
    function XmlToArray($xml)
    {
       $this->xml = $xml;   
    }
   
    function _struct_to_array($values, &$i)
    {
        $child = array();
        if (isset($values[$i]['value'])) array_push($child, $values[$i]['value']);
       
        while ($i++ < count($values)) {
            switch ($values[$i]['type']) {
                case 'cdata':
                array_push($child, $values[$i]['value']);
                break;
               
                case 'complete':
                    $name = $values[$i]['tag'];
                    if(!empty($name)){
                    $child[$name]= ($values[$i]['value'])?($values[$i]['value']):'';
                    if(isset($values[$i]['attributes'])) {                   
                        $child[$name] = $values[$i]['attributes'];
                    }
                }   
              break;
               
                case 'open':
                    $name = $values[$i]['tag'];
                    $size = isset($child[$name]) ? sizeof($child[$name]) : 0;
                    $child[$name][$size] = $this->_struct_to_array($values, $i);
                break;
               
                case 'close':
                return $child;
                break;
            }
        }
        return $child;
    }
   
    function createArray()
    {
        $xml    = $this->xml;
        $values = array();
        $index  = array();
        $array  = array();
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parse_into_struct($parser, $xml, $values, $index);
        xml_parser_free($parser);
        $i = 0;
        $name = $values[$i]['tag'];
        $array[$name] = isset($values[$i]['attributes']) ? $values[$i]['attributes'] : '';
        $array[$name] = $this->_struct_to_array($values, $i);
        return $array;
    }
   
   
}


Succes!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Juist, en daarom noemde ik specifiek PHP 5, in de hoop dat iets nieuwer als simplexml gevonden zou worden. Zoek dat alsnog en je krijgt minder low level parse code dan bovenstaande. :) Bovenstaande code is echt enorm PHP 4. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het betreft inderdaad EffectOnTheWeb.

De volgendeoplossing heb ik momenteel:

PHP:
1
2
3
4
5
$oXML = simplexml_load_string($result->MijnAanbodResult->any);
            
foreach( $oXML->dsAanbodMakelaar->Pand as $oPand ){
    echo $oPand->PandID."<br />\n";
}


Tot op heden is dit alles wat in nodig heb om de output te verwerken.

Bedankt voor jullie hulp en meedenken!
Pagina: 1