2013-05-22 4 views
1

Ce que j'essaie de faire dans notre environnement d'entreprise est de me connecter à un service Web SAP en utilisant la classe PHP SoapClient en mode wsdl.SOAP avec PHP vers SAP Web Service

Jusqu'à présent, j'ai réussi à obtenir des erreurs de "propriété manquante". Lors de la résolution de toutes les erreurs de propriété manquantes Je reçois l'erreur http redoutée 500 avec le corps: savon env: Serveur

Donc, voici mon code:

class SapTest { 
const SAP_WSDL_URI = *wsdl_uri*; 
const SAP_USER = *username*; 
const SAP_PWD = *password*; 

public function execute() { 

     $client = new SoapClient('http://'.urlencode(self::SAP_USER).':'.urldecode(self::SAP_PWD).'@'.self::SAP_WSDL_URI, 
       array("trace" => 1, 
         "exceptions" => 1, 
         "login" => self::SAP_USER, 
         "password" => self::SAP_PWD, 
         'features' => SOAP_SINGLE_ELEMENT_ARRAYS) 
     ); 

     $method = '_-bic_-nf2'; 

     $parameter = array('ETColumnDescription' => null, 
          'ETGridData' => null, 
          'ETMessageLog' => null, 
          'ETRowDescription' => null, 
          'ISVar_01xwerbet' => array('Sign' => 'I', 
                 'Option' => 'LE', 
                 'Low' => '3', 
                 'High' => null)); 

     try 
     { 

     $result = $client->$method($parameter); 
     print_r($result); 
     } catch(SoapFault $e) { 

     echo "REQUEST HEADER:\n" . $client->__getLastRequestHeaders() . "\n"; 
      echo "REQUEST:\n" . $client->__getLastRequest() . "\n"; 

      echo "RESPONSE HEADER:\n" . $client->__getLastResponseHeaders() . "\n"; 

      echo "RESPONSE:\n" . $client->__getLastResponse() . "\n"; 
     print_r($e); 
    } 


} 

} 

$oSap = new SapTest(); 
$oSap->execute(); 

ma sortie xml semble comme suit:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:sap-com:document:sap:soap:functions:mc-style"> 
<SOAP-ENV:Body> 
    <ns1:_-bic_-nf2> 
    <ETColumnDescription/> 
    <ETGridData/> 
    <ETMessageLog/> 
    <ETRowDescription/> 
    <ISVar_01xwerbet> 
    <Sign>I</Sign> 
    <Option>LE</Option> 
    <Low>3</Low> 
    <High/> 
    </ISVar_01xwerbet> 
    </ns1:_-bic_-nf2> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

le xml attendu devrait ressembler comme suit:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style"> 
<soapenv:Body> 
    <urn:_-bic_-nf2> 
    <ETColumnDescription/> 
    <ETGridData/> 
    <ETMessageLog/> 
    <ETRowDescription/> 
    <ISVar_01xwerbet> 
    <Sign>I</Sign> 
    <Option>LE</Option> 
    <Low>3</Low> 
    <High/> 
    </ISVar_01xwerbet> 
    </urn:_-bic_-nf2> 
</soapenv:Body> 
</soapenv:Envelope> 

Je ne sais pas si elle est la balise d'en-tête vide manquante, que je ne peux pas sembler pouvoir ajouter avec PHP de base (je peux ajouter un en-tête, mais ajouter un en-tête vide semble être la partie la plus difficile). Ou si ce sont les différents préfixes (ns1/urn ou soapenv/SOAP-ENV) mais je commence à devenir fou sur ce point. L'aide serait très appréciée.

Merci d'avance!

Répondre

0

Votre demande SOAP est correcte. ns1/urn et soapenv/SOAP-ENV ne sont que des préfixes représentant l'espace de noms. Différents moteurs Webservice génèrent différemment leurs préfixes d'espace de noms et un Webservice doit les attendre.

En-tête SOAP n'est pas une chose obligatoire pour un service Web, mais si votre service attend, vous devez fournir cela.

Je vous suggère de parler au fournisseur de service de ce qui s'est passé avec la demande, et si ce n'est pas possible, utilisez un outil de test SOAP, comme SOAPui.

Pour créer un en-tête SOAP vide, essayez

$header =new SoapHeader('urn:sap-com:document:sap:soap:functions:mc-style', null); 
$client->__setSoapHeaders($header); 
+0

Merci pour votre réponse, est-il un moyen de faire un en-tête SOAP vide? –

+0

mise à jour de réponse. –

+0

Je reçois une erreur fatale :-(merci bien, en essayant autre chose –