Webservice via php nutzen -

4. September 2018 11:18

Hallo Community,

ich möchte den Webservice von Navision nutzen, um einen Webshop anzubinden. Trotz vieler Suchstunden im Internet komme ich leider nicht weiter... :-(

Den Webservice im Navision habe ich aktiviert (wie in den Internetbeispielen Page,21,Kunde usw.). Der SOAP-Webservice lässt sich auch im Browser öffnen und gibt eine entsprechende XML-Struktur zurück, beim OData kommt es lustigerweise als Newsfeed (ohne Daten, aber mit der richtigen Anzahl der Kunden).

Wenn ich versuche den SOAP-Webservice zu benutzen...

Code:
$context = stream_context_create([
 'ssl' => [
 // set some SSL/TLS specific options
 'verify_peer' => false,
 'verify_peer_name' => false,
 'allow_self_signed' => true
 //'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT
 ]
]);

$options = array(
    'encoding' => 'UTF-8',
    'verifypeer' => false,
    'verifyhost' => false,
    'soap_version' => SOAP_1_2,
    'trace' => 1,
    'exceptions' => 1,
    'connection_timeout' => 180,
//                'cache_wsdl'=>WSDL_CACHE_NONE,
 "login" => $login,
 "password" => $password,
 "features" => SOAP_SINGLE_ELEMENT_ARRAYS,
 "stream_context" => $context);

$page = new SoapClient($baseUrl, $options);


...kommt beim Ausführen der letzten Zeile folgende Fehlermeldung:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'xxx' : failed to load external entity "xxx" in C:\Installation\xampp\htdocs\phptest\index.php:76 Stack trace: #0 C:\Installation\xampp\htdocs\phptest\index.php(76): SoapClient->SoapClient('http://....', Array) #1 {main} thrown in C:\Installation\xampp\htdocs\phptest\index.php on line 76


Das Internet reagiert mit wüsten Anpassungen der $context- und $options-Variablen (wie man oben sieht), was leider nichts hilft. $baseUrl stimmt, direkt vom Navision übernommen und im Browser getestet. Interessanterweise kann ich sowohl bei $baseUrl, $login und $password reinschreiben, was ich will, die Fehlermeldung ändert sich nicht > d.h. irgendetwas anderes ist faul, nur was?

Mit OData-Webservice und Curl habe ich es auch probiert...

Code:
$ch = curl_init();
       
curl_setopt($ch, CURLOPT_URL, $baseUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   
curl_setopt($ch, CURLOPT_USERPWD, 'xxx');   
curl_setopt($ch, CURLOPT_HTTPHEADER, [
//        'Method: GET',
//      'User-Agent: PHP-SOAP-CURL',
//        'Content-Type: text/xml; charset=utf-8',
//      'SOAPAction: Read',
        'Connection: Keep-Alive',   
        'Accept: application/json',         
        'Content-Type: application/json; charset=utf-8',   
        "Accept:*"                       
]);   


$res = curl_exec($ch);

if( $res === false ) {
   echo 'Curl-Fehler (OData-Abfrage): ' . curl_error($ch).'<br />';
}
else {
   echo $res;
   $response = json_decode($res);
   echo json_encode($response, JSON_PRETTY_PRINT);
}
/* $response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT); */

// Close handle
curl_close($ch);


... hier kommt zwar kein Fehler zurück, aber immer NULL.

Seht Ihr vielleicht auf den ersten Blick etwas oder habt einen Diagnose-Tipp oder Link, der mir weiterhilft?

Viele Grüße,
Dga

Navision: 2013 R2
Php 7.1.11 (Xampp)

Re: Webservice via php nutzen -

4. September 2018 13:08

Hast du mal versucht mittels https://www.soapui.org auf den Webservice zuzugreifen?
Welche Authentifizierung nutzt du denn am ServiceTier?

Re: Webservice via php nutzen -

4. September 2018 13:44

SoapUI hat das gemeldet:

Error loading WDSL
There was something wrong with the WDSL you are trying to import
Error loading [http://xxx]: org.apache.xmlbeans.XmlException: org.apache.xmlbeans.XmlException: error: Unexpected end of file after nul


Wir benutzen unsere Domänenanmeldung, d.h. Windows-Authentifizierung...

Ich habe grade in der Benutzerkarte noch den Punkt Webdienstzugriff gefunden und dort einen Webdienstzugriffsschlüssel erstellt... Muss ich so etwas vielleicht noch benutzen?

Re: Webservice via php nutzen -

4. September 2018 13:58

Bei einem Rest-Projekt im SoapIU kommt folgende Fehlermeldung:

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: NTLM
Date: Tue, 04 Sep 2018 11:55:01 GMT


... habe noch nicht herausbekommen, in welcher Form ich die Anmeldedaten in den Request einbauen muss...

Edit: doch, habs herausgefunden, jetzt habe ich via OData/REST im SoapUI Zugriff...

Edit2: habe jetzt auch via SOAP im SoapUI Zugriff > beide Male musste ich unseren Domänennamen (die Kurzvariante, da blicke ich nicht durch) noch hinzufügen...

Re: Webservice via php nutzen -

4. September 2018 14:32

Ok, kurze Zusammenfassung:

das Verbinden mittels SoapUI hat nun funktioniert > die Schnittstelle seitens Navision ist erstmal ok...

Wie kann ich das nun im php verwerten?

Kann/Muss ich da irgendwo die Domäne angeben? Ich habe es vor dem Benutzernamen versucht mit allen Slash-/Backslash-Kombinationen), hat nicht funktioniert - Fehler identisch wie im ersten Post.
Sehe ich irgendwo die Zugriffsparameter, mit denen das SoapUI die Verbindung korrekt hergestellt hat?

Re: Webservice via php nutzen -

4. September 2018 17:39

Wenn du von außerhalb deiner Domäne zugreifen willst musst du dir ein ServiceTier aufsetzen, dass NavUserPassword unterstützt.
Hier kannst du dich dann per BasicAuth authentifizieren. Du brauchst hierfür aber auch später einen Benutzer mit Benutzernamen / Kennwort.
Die Windowsbenutzer kannst du nicht nutzen.

Re: Webservice via php nutzen -

5. September 2018 09:20

Hallo zusammen,

@MarkusWeiland: Nein, ich will nicht von außerhalb der Domäne zugreifen, die Verbindung zum Webshop funktioniert nach außen... und vielen Dank für Deine schnellen Antworten.

Ich habe es soeben mit OData und NTLM hinbekommen:

Code:
$baseUrl = "xxx"; // Pfad aus Navision Web Service
$usrpwd = "yyy"; // "user:pwd" > Domäne ist nicht mehr notwendig

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $baseUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, $usrpwd);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Connection: Keep-Alive',   
        'Accept: application/json',     
        'Content-Type: application/json; charset=utf-8'
]);   

$res = curl_exec($ch);

if ( curl_errno($ch) ) {
   print 'Curl-Fehler (OData-Abfrage):' . curl_error($ch);
}
else {
   $response = json_decode($res);
   curl_close($ch);
   
   echo '<br /><br /><pre>';
   print_r($response);
   echo '</pre><br /><br />';
   
}


Sehr wichtig war die Option: curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); da das NTLM im Navision aktiviert war (hatte ich gestern testweise aktiviert) - ich weiß jetzt nicht ob es ohne auch geht...