2016-05-03 5 views
0

Ich entwickle einen Soap-Service/eine Verbindung zu AFAS und basierend auf der WSDL (die passwortgeschützt ist) generiert Delphi eine Schnittstelle.Delphi HttpRio SOAPHTTPClient fügt den Namespaced-Variablen kein Präfix hinzu

kann ich die resultierende Schnittstelle rufen mit HTTPRio und die GetConnector, dass es mich dann sieht vor:

FGetAfas.GetData(FEnvironment, FUsername, FPassword, '', FConnectorID, '') 

Funktion:

function FGetAfas(): GetConnectorSoap; 
var 
    HTTPRIO: THTTPRIO; 
begin 
    HTTPRIO := THTTPRIO.Create(nil); 
    with HTTPRIO.HTTPWebNode do begin 
    ConnectTimeout := 60000; 
    SendTimeout := 60000; 
    ReceiveTimeout := 60000; 
    UserName := FDomain + '\' + FUsername; 
    Password := FPassword; 
    end; 

    Result := GetGetConnectorSoap(False, FUrl, HTTPRIO); 
end; 

Die resultierende Seife Aufruf sieht dann wie folgt aus:

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:Afas.Profit.Services"> 
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <NS1:GetData xmlns:NS1="urn:Afas.Profit.Services"> 
     <environmentId>ab1</environmentId> 
     <userId>aaa</userId> 
     <password>bbb</password> 
     <connectorId>1</connectorId> 
    </NS1:GetData> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Der empfangende Server gibt jedoch eine Warnung zurück, dass environmentId leer ist. Was, wie Sie oben sehen können, ist es nicht.

Ich habe das Problem herausgefunden, aber es stellt sich heraus, dass der Server erwartet, dass die Unterelemente mit dem NS1-Namespace vorangestellt werden. viel wie folgt aus:

<NS1:GetData xmlns:NS1="urn:Afas.Profit.Services"> 
    <NS1:environmentId>ab1</NS1:environmentId> 
    <NS1:userId>aaa</NS1:userId> 
    <NS1:password>bbb</NS1:password> 
    <NS1:connectorId>1</NS1:connectorId> 
</NS1:GetData> 

(Ich werde die Körper und Hülle Bits in diesem Beispiel überspringen) Wenn ich die neue Anforderung in SoapUI setzen, alles funktioniert gut.

So kommen wir auf die Frage (n):

  • 1: Es es normal, dass ein Server die untergeordneten Elemente eines Namespaced Element erfordern auch ein Namespacepräfix haben?

  • 2: Gibt es eine elegante Möglichkeit, sicherzustellen, dass die Delphi-Schnittstelle das Namespacepräfix an die Werte anfügt? Eine Möglichkeit wäre, eine stringreplace in einer HTTPRIO.OnBeforeExecute-Prozedur auszuführen. aber das scheint keine sehr elegante Art zu sein, eine Lösung zu finden.

SoapUI generiert die folgende Anforderung, wenn aus dem WSDL-Laden:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:Afas.Profit.Services"> 
    <soap:Header/> 
    <soap:Body> 
     <urn:GetData> 
     <!--Optional:--> 
     <urn:environmentId>?</urn:environmentId> 
     <!--Optional:--> 
     <urn:userId>?</urn:userId> 
     <!--Optional:--> 
     <urn:password>?</urn:password> 
     <!--Optional:--> 
     <urn:logonAs>?</urn:logonAs> 
     <!--Optional:--> 
     <urn:connectorId>?</urn:connectorId> 
     <!--Optional:--> 
     <urn:filtersXml>?</urn:filtersXml> 
     </urn:GetData> 
    </soap:Body> 
</soap:Envelope> 
+0

Zuerst müssen Sie immer angeben, welche Version von Delphi Sie verwenden und ob Sie ein WSDL-Importer der höheren Version verwenden (manchmal können Sie Probleme mit neueren Importern beheben). Als nächstes, wie sieht die Anfrage aus, wenn Sie es mit SoapUI generieren? Hat es Präfixe für alles? –

+0

ein wenig offtopic, ich sehe Sie verwenden den GetConnector über NTLM (= Legacy).Besser ist es, einen AppConnector (zukunftssicher) zu verwenden. Ich habe die Verbindung zu Webservices mit Delphi aufgegeben. .NET hat eine einfachere Unterstützung für Web/WCF (FYI, ich habe kürzlich ein AFAS-Integrationsprojekt mit C# implementiert). – whosrdaddy

+0

Yup, die soapui generierte Anfrage hat den Namensraum vor jeder Zeile. - hinzugefügtes Versions-Tag (Delphi-7), auch ein guter Punkt auf dem AppConnector, ich werde später darauf eingehen müssen, aber danke für den Zeiger. Der Dienst in Frage ist: "https://profitweb.afasonline.nl/profitservices/getconnector.asmx" –

Antwort

0

auf einige von uns sucht, nein, ist es nicht normal, Namensräume auf jedem Element erfordern. NS1 auf dem übergeordneten Knoten GetData sollte Sie abdecken. Aber die Serverimplementierung kann variieren ... Sie sagen nicht, welchen Dienst Sie schlagen.

Ich empfehle, einen Schein-Service mit SoapUI zu erstellen, dann ändern Sie Ihren Endpunkt, um den SoapUI-Schein zu treffen und zu sehen, ob es funktioniert. Wenn ja, dann liegt das Problem beim Server. Oh, du wirst deinen Code immer noch reparieren müssen, um mit dem Server zu arbeiten, aber du wirst die Befriedigung haben, richtig zu sein.

+0

Recht zu haben ist immer nett. Obwohl es die Zeit leider kostet. Ich kann am Ende nur ihre Unterstützung per E-Mail senden, um einen Blick darauf zu werfen, und nur manuell die NS1-Präfixe für jetzt hinzufügen. So kann die Verbindung weiter getestet werden. –