SOAP-Dienst/WSDL verstehen

trabifant

Lt. Commander
Registriert
März 2004
Beiträge
1.311
Hallo zusammen,

eines vorab: ich bin in Powershell und wsdl so gut wie nicht bewandert, daher kann es passieren, dass hier nicht die korrekten Termini benutzt werden.

Ich versuche derzeit, ein Powershell-Skript anzupassen, welches über https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl einen Dienst abfragt. Die Antwort des Dienstes ist folgendermaßen definiert (nur Auszüge aus der wsdl):
XML:
<xsd:element name="checkVatApproxResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="countryCode" type="xsd:string"/>
<xsd:element name="vatNumber" type="xsd:string"/>
<xsd:element name="requestDate" type="xsd:date"/>
<xsd:element name="valid" type="xsd:boolean"/>
...
<xsd:element maxOccurs="1" minOccurs="0" name="traderNameMatch" type="tns1:matchCode"/>
<xsd:element maxOccurs="1" minOccurs="0" name="traderCompanyTypeMatch" type="tns1:matchCode"/>
<xsd:element maxOccurs="1" minOccurs="0" name="traderStreetMatch" type="tns1:matchCode"/>
<xsd:element maxOccurs="1" minOccurs="0" name="traderPostcodeMatch" type="tns1:matchCode"/>
<xsd:element maxOccurs="1" minOccurs="0" name="traderCityMatch" type="tns1:matchCode"/>
<xsd:element name="requestIdentifier" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
...
<xsd:simpleType name="matchCode">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="1">
<xsd:annotation>
<xsd:documentation>VALID</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="2">
<xsd:annotation>
<xsd:documentation>INVALID</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="3">
<xsd:annotation>
<xsd:documentation>NOT_PROCESSED</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

Der Matchcode ist als Enumeration definiert und kann VALID, INVALID oder NOT_PROCESSED enthalten. Das Skript sieht folgendermaßen aus:
Code:
Function Get-ViesVatNumber {
[CmdletBinding()]
    param (
        [Parameter(Mandatory=$true,
                   Position=0)]
        $CountryCode,

        [Parameter(Mandatory=$true,
                   Position=1)]
        $VatNumber
    )

    $Vies = New-WebServiceProxy -Uri "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl" -Class "checkVat"

    $Valid = $false
    $TraderName = "Comm.VA ALPRO"
    $TraderAddress = ""
    $Identifier = ""
    $TraderCompanyType = ""
    $TraderStreet = ""
    $TraderPostcode = "" 
    $TraderCity = ""
    $TraderNameMatch = 1
    $TraderNameMatchSpecified = $false
    $TraderCompanyTypeMatch = 1
    $TraderCompanyTypeMatchSpecified = $false
    $TraderStreetMatch =1
    $TraderStreetMatchSpecified = $false
    $TraderPostcodeMatch = 1
    $TraderPostcodeMatchSpecified = $false
    $TraderCityMatch = 1
    $TraderCityMatchSpecified = $false
    $RequesterCountryCode = "DE"
    $RequesterVatNumber = "813984816"

    $DateChecked = $Vies.checkVatApprox([ref]$CountryCode, [ref]$VatNumber, [ref]$TraderName, [ref]$TraderCompanyType, [ref]$TraderStreet, [ref]$TraderPostcode, [ref]$TraderCity, $RequesterCountryCode, $RequesterVatNumber, [ref]$Valid, [ref]$TraderAddress, [ref]$TraderNameMatch, [ref]$TraderNameMatchSpecified, [ref]$TraderCompanyTypeMatch, [ref]$TraderCompanyTypeMatchSpecified, [ref]$TraderStreetMatch, [ref]$TraderStreetMatchSpecified, [ref]$TraderPostcodeMatch, [ref]$TraderPostcodeMatchSpecified, [ref]$TraderCityMatch, [ref]$TraderCityMatchSpecified, [ref]$Identifier)

    $Properties = @{
        'CountryCode'   = $CountryCode
        'VatNumber'     = $VatNumber
        'Valid'         = $Valid
        'Name'          = $TraderName
        'Name Match'    = $TraderNameMatch
        'Address'       = $TraderAddress
        'Street'        = $TraderStreet
        'Postcode'      = $TraderPostcode
        'City'          = $TraderCity
        'DateChecked'   = $DateChecked
        'Consultation'  = $Identifier
    }

    $Company = New-Object -TypeName PSCustomObject -Property $Properties

    Write-Output $Company
}

Get-ViesVatNumber -CountryCode "BE" -VatNumber "0420429375"

Als Antwort erhalte ich dann allerdings das hier:
Code:
Name         : Comm.VA ALPRO
Street       : 
Name Match   : Item1
CountryCode  : BE
DateChecked  : 20.01.2022 00:00:00
VatNumber    : 0420429375
Address      : Vlamingstraat 28
               8560 Wevelgem
City         : 
Valid        : True
Postcode     : 
Consultation : WAPIAAAAX55rdpIj

Meine Fragen wären daher:
1. Warum wird als "Name Match" nun auf einmal "Item1" ausgegeben und nicht einer der in der wsdl-Definition vorgesehenen Enumeration-Werte?
2. Die Methode checkVatApprox hat als Rückgabewerte offensichtlich einen DateTime-Wert, aber wie können dann zur selben Zeit weitere Datentypen zur Verfügung stehen und die vorhandenen Variablen überschreiben?
3. Wenn ich die Methoden des Dienstes über Powershell abfrage, dann stehen mehrere Methoden zur Verfügung. Per SOAP-Tool aber nur zwei zum VAT-Check. Wie erklärt sich das?
 
Der Code ist unvollständig-- es gibt externe Abhängigkeiten.

Sieht man in Zeile 13 recht gut: dort wird in eine Objektklasse checkVat eingelesen, die aber nirgendwo definiert ist und die wiederum mindestens die in Zeile 36 aufgerufene Methode mitbringt.
Per angegebener Signatur scheint ausgeschlossen, daß diese Objektklasse in Powershell definiert wurde.

Du müßtest also schauen, ob Du die zugehörige Assembly (bzw COM Library; mit der Signatur scheint das durchaus wahrscheinlich) ausfindig machen kannst -- bzw deren Dokumentation und/oder den Quellcode zum Selberanschauen.
 
  • Gefällt mir
Reaktionen: JP-M und h00bi
Ausprobiert?

Dann würde mich interessieren, was hinten rauskommt. Denn der Teil in Zeile 36 funktioniert dann nicht mehr.

Aber, ja, powershell erlaubt sehr sehr viel, vielleicht zuviel, was man „normalerweise“ nicht machen kann. Oder sollte.
Ggfs mal den strict mode anschalten. Dann meckert es mehr.
 
Ja, ausprobiert habe ich es und das Ergebnis ist immer noch das Erwartete.
 
Und was steht in datechecked? 🤔

Gut, ob der Eintrag jetzt Relevanz hat, keine Ahnung.
 
DateChecked selbst ist wirklich nur eine DateTime-Angabe. Offenbar lässt sich der Aufruf der Methode offenbar überladen (heißt das so?) und man kann die Inhalte der anderen Attribute auslesen.
Es scheint aber auch so zu sein, dass der Dienst unsauber implementiert ist. Wenn ich als Methode checkVat, statt checkVatApprox, nutze, dann wird die Enumeration in "Name Match" sauber mit 1 zurückgegeben.
 

Ähnliche Themen

Zurück
Oben