SOAP Request met wsdl file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 08:05
Hallo,

Ik ben bezig met een ontwikkeling dat een ASP.NET omgeving met de PHP kant kan communiceren over SOAP berichten. Ik doe de PHP omgeving maar wil het kunnen testen door SOAP berichten door te sturen naar de server omgeving om te bekijken wat de response is.

Helaas loop ik dus tegen een probleem aan dat bij het maken van een request op 1 of andere manier niet de juiste request word opgesteld mbv de wsdl file.

En word de juiste request gemaakt naar mijn idee dan krijg ik de volgende melding;

"Procedure 'retrieve_product_information' not present"

Nu heb ik bekeken wat er aan de hand kan zijn en er word eigenlijk constant geroepen dat er caching problemen zijn en je die moet uitzetten. Tot mijn verbazing werkt dit niet, ik heb de caching al die tijd al uit staan tijdens de ontwikkeling.

Dit is mijn testclient code is simpel opgezet.
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
function dump($mData,$sHeader='') {
    if (strlen($sHeader)>0){
                                 echo "<br/><b>".$sHeader."</b>";
    }
    echo '
<pre style="font-size: 10pt;">';
    var_dump($mData);
    echo '</pre>';
}//END dump

$sFunction_name = 'retrieve_product_information';
$oSoap_client = null;
$sWSDL_Url = 'http://..../soap_api.php?wsdl';
$sInformation = '<retrieve_product_information xmlns="http://..../soap_api.php?wsdl">
<sku>3115030009</sku>
</retrieve_product_information>';

try {
    $oSoap_client = new SoapClient($sWSDL_Url, array('trace' => 1, 'cache_wsdl' => WSDL_CACHE_NONE)); //trace => enables the use of __getLastRequest
    //$oSoap_client->__setLocation(str_replace('?wsdl', '', $sWSDL_Url));
    dump($oSoap_client->__getFunctions(), '$oSoap_client->__getFunctions()');
    $oSoap_var = new SoapVar($sInformation, 147);
    $oResult = $oSoap_client->__soapCall($sFunction_name, array($oSoap_var));
    $sLast_request_string = $oSoap_client->__getLastRequest();
    $sLast_request_response = $oSoap_client->__getLastResponse();   
    
    dump($oSoap_client->__getFunctions(), '$oSoap_client->__getFunctions()');
    dump($oSoap_client->__getLastRequest(), '$oSoap_client->__getLastRequest()');
    dump($oSoap_client->__getLastResponse(), '$oSoap_client->__getLastResponse()');
}
catch(SoapFault $e)
{
        dump($e);
    $sLast_request_string = null;
    if(!is_null($oSoap_client)) {
        $sLast_request_string = $oSoap_client->__getLastRequest();
    }   
    
    dump($sLast_request_string, __FUNCTION__, __LINE__);
}


Daarnaast heb ik de volgende code als server opgezet.
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
<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING );
ini_set("soap.wsdl_cache_enabled", 0);
include_once(dirname (__FILE__).'/datamodules/settings.php');
include_once(dirname(__FILE__).'/engine/DDC_framework.php');
/**
 * clDDC_shop_information -- Shop function class
 *
 * this class contains the soap api functions
 *
 * @author  Danny bevers
 * @since   Thu Jan 10  11:55:00 CEST 2012
 **/
class clDDC_shop_information 
{       
    /**
     * retrieve_product_information -- Get product data
     *
     * Get product data with a product code
     *
     * @author  Danny bevers
     * @since   Thu Jan 10  11:55:00 CEST 2012
     * @param   string  $sProduct_code
     *
     * @return  string
     */         
    public function retrieve_product_information($sku)
    {
        global $oFramework;

        return $oFramework->xml_soap_get_product($sku);
    }
    
    /**
     * retrieve_cart_information -- Get cart data
     *
     * Get cart data with a product code with amount 
     *
     * @author  Danny bevers
     * @since   Thu Jan 12  9:04:00 CEST 2012
     * @param   array   $aProduct_collection[]
     *
     * @return  string
     */         
    public function retrieve_cart_information($aProduct_collection)
    {
        global $oFramework;
        
        return $oFramework->xml_soap_get_cart_products($aProduct_collection);
    }
}

$server = new SoapServer('wsdl/soap_api.wsdl');
$server->setClass('clDDC_shop_information');
$server->handle();
?>


Wanneer ik de versie van mijn wsdl gebruikt werkt alles perfect alleen zodra ik nu de nieuwe gebruik van de tegenpartij die met ASP kan werken doet het niks meer en krijg ik de "Procedure 'retrieve_product_information' not present" melding.

De nieuwe wsdl die ik van de tegenpartij heb gekregen is hier te bekijken (http://pastebin.com/9WyJpTJb)

Ik ben ten einde raad wat er nu aan de hand is heb er nog een aantal mensen naar laten kijken maar tot op heden zonder resultaat.

Acties:
  • 0 Henk 'm!

Verwijderd

Vaak zit het probleem in de manier van wrappen in het soap-request. Php doet een aantal dingen anders dan bijv python of ASP.NET.

De beste manier van debuggen is door je laatste request op te vragen dwz je soap-request. En te vragen aan het bedrijf hoe een voorbeeld soap-envelope eruit moet zien.

Edit: Ik lees verkeerd... Maar mijn debuggen advies blijft!

[ Voor 17% gewijzigd door Verwijderd op 28-03-2012 11:32 ]


Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 08:05
Klopt, de tegenpartij is de client en ik ben de server. Wij hebben de server (PHP) opgezet en geven een callback naar de tegenpartij. Ik heb geen code van de tegenpartij die de client zijn dus weet niet hoe hun code in elkaar zit.

Ik ben alles bij mezelf aan het testen. Die zijn in PHP vandaar je alleen php connecties ziet.

Acties:
  • 0 Henk 'm!

Verwijderd

Wacht even. Als jij de server bent, waar zit dan het probleem?

Even kort:
- Jullie bieden een webservice aan
- Klant zegt dat het niet werkt met ASP
- Jullie passen wsdl aan totdat het werkt met ASP

Is dat een beetje het idee?

Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 08:05
Ja klopt ik ben de server. Wij hadden een WSDL opgezet alleen die werkte niet in combinatie met hun ASP kant. We hebben toen gevraagd of hun een WSDL wilde genereren die hebben we gekregen zoals in de FP staat.

Deze werkt voor hun kant nu wat beter alleen lopen we tegen wat problemen aan dat er geen response word teruggegeven vanuit onze kant (server kant). Nu proberen we dus een client op te zetten die communiceert met de server maar dit blijft dan problemen geven met "Procedure 'retrieve_product_information' not present".

Acties:
  • 0 Henk 'm!

Verwijderd

Ik denk dat je het een beetje verkeerd aangepakt hebt. Je moet kijken naar de berichten die verstuurd worden. Dus waar ging het fout bij de data opvragen van de klant. Wat was het verschil in SOAP-envelopes.

Maar nu je toch de nieuwe al gebruikt. Moet je even gaan debuggen.
- Wat geeft getFunctions op je soapserver?
- Maak een destruct een een construct aan in je server. Kom je daar uberhaubt? Dus log naar een file.
- Kan de klant wel communiceren met deze wsdl, zo ja vraag de soap-envelope van hun op, dan pas kun je vergelijken.

Hier bijv:
PHP:
1
$oResult = $oSoap_client->__soapCall($sFunction_name, array($oSoap_var))


Stop je als nog een array om de soapvar heen. Php kan hier nog best wat crap bijverzinnen. Zorg er dus voor dat je een soap-envelope als vergelijkingsmateriaal hebt.

En kijk ook even hoe je officieel met Soapvars moet werken: http://www.php.net/manual/en/soapvar.soapvar.php

Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 08:05
Na het goed zoeken kwam ik uit dat ik via de client een foutieve request stuurde. De wsdl verwachte een object vanwege de complextypes die waren aangegeven. Nadat ik dit had gedaan (een object gemaakt) en meestuurde werkte de request goed! Moest alleen nog wat aanpassingen maken in de server zodat die de object aan kon.

Alles is opgelost probleem verholpen :9

[ Voor 6% gewijzigd door DannyBevers op 28-03-2012 16:00 ]


Acties:
  • 0 Henk 'm!

  • mkleinman
  • Registratie: Oktober 2001
  • Laatst online: 18:01

mkleinman

8kWp, WPB, ELGA 6

Je zou ook nog kunnen testen met SoapUI. Kwestie van de WSDL inlezen in SoapUI en kijken of je met SoapUI je webservice kan testen.

Als het werkt met SoapUI dan zit het probleem toch echt aan de client kant.

Duurzame nerd. Veel comfort en weinig verbruiken. Zuinig aan doen voor de toekomst.


Acties:
  • 0 Henk 'm!

  • DannyBevers
  • Registratie: November 2009
  • Laatst online: 08:05
mkleinman schreef op woensdag 28 maart 2012 @ 14:55:
Je zou ook nog kunnen testen met SoapUI. Kwestie van de WSDL inlezen in SoapUI en kijken of je met SoapUI je webservice kan testen.

Als het werkt met SoapUI dan zit het probleem toch echt aan de client kant.
Bedankt voor de tip van het programma ;) Het is tevens opgelost zoals ik bovenstaand bericht al had vermeld maar tips zijn natuurlijk altijd welkom voor de toekomst :9
Pagina: 1