XML SOAP bericht met CURL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Johan Dam

Johan Dam

22/07/2010 09:47:27
Quote Anchor link
Yoo,

Ik heb een soap bericht die gestuurd word naar het bedrijf creditsave, helaas blijft hij maar een 400 Bad Request teruggeven,

Ik heb al gesproken met het bedrijf zelf, die goed hun best gedaan hebben, maar er ook niet uitkomen, hopelijk dat iemand hier ervaring heeft met SOAP en ziet wat er mis gaat.

Even ter verduidelijking, de curl_exec geeft true terug en voor de rest een lege pagina's, in de HTTP Header is de 400 Bad Request,

wie oh wie kan me helpen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
error_reporting(E_ALL);
$credentials = "*****:*****";
$url = "urlnaarsoappagina";

$xml = '
<GetCountries xmlns="https://www.creditsafe.com/">
    <filter>
        <Codes>
            <Code>DE</Code>
        </Codes>
    </filter>
</GetCountries>
'
;

$message =
'<?xml version="1.0" encoding="UTF-8" ?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    <soap:Body>'
.
            $xml .
        '</soap:Body>
</soap:Envelope>'
;

$headers = array(
    "Content-Type: text/xml; charset=utf-8",
    "Content-Length: " . strlen($message),
    "SOAPAction: \"\"",
    "Authorization: Basic " . base64_encode($credentials),
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);

$start = microtime(true);
$result = curl_exec($ch);
$total_time = microtime(true) - $start;

if(curl_errno($ch))
    $result = 'ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch);

curl_close($ch);

echo "<xmp>", $result;
?>
 
PHP hulp

PHP hulp

22/12/2024 08:17:24
 

22/07/2010 09:50:26
Quote Anchor link
Waarom gebruik je niet gewoon php's eigen soap gedoe?
En het liefste schrijf je xml met dom of simplexml...
 
Johan Dam

Johan Dam

22/07/2010 10:05:41
Quote Anchor link
omdat ik daar nog niet eerder mee gewerkt heb (word miss toch maar tijd)
en persoonlijk vind ik een xml bericht uittikken in een string overzichtelijker
 
Niek s

niek s

22/07/2010 11:00:59
Quote Anchor link
Gebruik gewoon PHP's SOAPClient.

Bied de server een WSDL document aan? Zo, ja dan is het namelijk erg eenvoudig te implementeren.

Probeer het eens met de SOAPClietn van PHP, kom je er dan niet uit (wel serieus proberen) dan laat nog maar horen.

Edit:
Met de SOAPClient van PHP, en als je een WSDL hebt, kan je simpelweg doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$o
= new SOAPClient('www.example.com/service.wsdl');
$resultaat = $o->getCountries(array('DE')); //.. of iets dergelijks ;-)

print_r($resultaat);
?>


Maar dan moeten ze wel een WSDL hebben. Een WSDL document is simpelweg een document voor SOAP services die beschrijft "dit zijn de functies die er zijn, ze verwachten de volgende data als input, en je krijgt het volgende terug. Hier kan je het vinden".
Als je dan een SOAPClient construct met de link naar de WSDL, maakt hij zelf in dat object dus al de gegeven getCountries() methode aan. Die snapt ie dan omdat hij de WSDL heeft. Aan de achterkant gaat hij dan dus contact zoeken via SOAP.

Als je geen WSDL hebt, kan je met een class de data oversturen. Door een bepaalde class in te richten (zie PHP.net) kan je opgeven hoe je de data wilt sturen.

Succes er mee
Gewijzigd op 22/07/2010 12:07:36 door niek s
 
Johan Dam

Johan Dam

22/07/2010 13:46:27
Quote Anchor link
@Niek, bedankt voor de tip, was er al mee bezig en kwam uit op het voorbeeld dat jij gaf, oke iets ingewikkelder (ssl verbinding, userpwd gegevens, enz)

Aan de ene kant valt het me erg mee, met veel minder regels code behaal ik hetzelfde resultaat,

Aan de andere kant, het is hetzelfde resultaat, het werkt nog steeds niet.

Foutmelding is:
Uncaught SoapFault exception: [HTTP] Could not connect to host

De __getFunctions functie geeft de verwachte functies terug (inclusief de getCountries) dus het ligt niet aan het wsdl bestand...

Proxy / firewall ook uitgetest, geen verschil,

Iemand nog een tip waar ik op moet letten?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(E_ALL);
echo "<pre>";

$wsdl = "creditsave.wsdl";

$options = array(
    'login' => '*****',
    'password' => '*****'
    'local_cert'
=> 'cert_key.pem',
    'trace' => 'true',
);


$soap = new SoapClient($wsdl, $options);
var_dump($soap->GetCountries(array("DU")));
?>
 
Niek s

niek s

22/07/2010 14:05:40
Quote Anchor link
Johan Dam op 22/07/2010 13:46:27:
@Niek, bedankt voor de tip, was er al mee bezig en kwam uit op het voorbeeld dat jij gaf, oke iets ingewikkelder (ssl verbinding, userpwd gegevens, enz)

Aan de ene kant valt het me erg mee, met veel minder regels code behaal ik hetzelfde resultaat,

Aan de andere kant, het is hetzelfde resultaat, het werkt nog steeds niet.

Foutmelding is:
Uncaught SoapFault exception: [HTTP] Could not connect to host

De __getFunctions functie geeft de verwachte functies terug (inclusief de getCountries) dus het ligt niet aan het wsdl bestand...

Proxy / firewall ook uitgetest, geen verschil,

Iemand nog een tip waar ik op moet letten?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(E_ALL);
echo "<pre>";

$wsdl = "creditsave.wsdl";

$options = array(
    'login' => '*****',
    'password' => '*****'
    'local_cert'
=> 'cert_key.pem',
    'trace' => 'true',
);


$soap = new SoapClient($wsdl, $options);
var_dump($soap->GetCountries(array("DU")));
?>


De WSDL die je opgeeft is geen URL. het is enkel een bestand. Je moet het volledige pad opgeven naar de WSDL toe.

Edit:
Dus bijvoorbeeld:
$wsdl = "ssl://www.bier.nl/meer/bier/service.wsdl";

=D
Gewijzigd op 22/07/2010 14:26:08 door niek s
 
Johan Dam

Johan Dam

22/07/2010 14:38:07
Quote Anchor link
Een URL naar de WSDL gaat niet (ssl en gebruiker authencatie problemen) vandaar dat ik het bestand handmatig gedownload heb en in dezelfde map als het script heb gestopt, gezien de __getFunctions werkt lijkt het me dat dit voldoende is,

(als het allemaal werkt ga ik het wat uitgebreider doen maar het moet eerst maar eens werken)
 
Niek s

niek s

22/07/2010 15:24:37
Quote Anchor link
Johan Dam op 22/07/2010 14:38:07:
Een URL naar de WSDL gaat niet (ssl en gebruiker authencatie problemen) vandaar dat ik het bestand handmatig gedownload heb en in dezelfde map als het script heb gestopt, gezien de __getFunctions werkt lijkt het me dat dit voldoende is,

(als het allemaal werkt ga ik het wat uitgebreider doen maar het moet eerst maar eens werken)


Dan betekent het dat de soap client geen verbinding kan leggen met de soap server. Kijk je SSL instellingen nog eens na.

(Heb je echt een client certificate nodig?!)
 
Johan Dam

Johan Dam

23/07/2010 12:19:40
Quote Anchor link
Niels,

Bedankt voor de aanrader (de 'local_cert' => 'cert_key.pem' was de boosdoener)

het lijkt nu te werken op 1 punt na,

Wat in het bericht moet komen te staan word op de volgende manier uitgelegd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<filter>
    <Codes>
        <Code/>
        <Code/>
    </Codes>
    <OnlineReports />
</filter>


Het gaat bij mij mis bij de Codes, zodra ik daar ook maar iets van een array inzet krijg ik de volgende foutmelding:

Fatal error: Uncaught SoapFault exception: [a:InternalServiceFault] There was an error while trying to deserialize parameter

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$param
= array(
    "filter" => array(
        "Codes" => array(
            "Code" =>"DU",
        ),

        "OnlineReports" => true,
    )
);

?>

Van Code ook een array maken werkt niet, "Codes" => array("DU"), of "Codes" => "DU", werkt ook niet...
Gewijzigd op 23/07/2010 13:44:58 door Johan Dam
 
Johan Dam

Johan Dam

26/07/2010 09:34:27
Quote Anchor link
*bump*
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.