Comment faire un appel de services Web SOAP WSDL à partir de la ligne de commande

92

Je dois faire un appel de service Web SOAP à https://sandbox.mediamind.com/Eyeblaster.MediaMind.API/V2/AuthenticationService.svc?wsdl et utiliser l'opération ClientLogin en passant par les paramètres: ApplicationKey, Password et UserName . La réponse est UserSecurityToken. Ce sont toutes des chaînes.

Voici le lien expliquant en détail ce que j'essaie de faire: https://sandbox.mediamind.com/Eyeblaster.MediaMind.API.Doc/?v=3

Comment puis-je faire cela sur la ligne de commande? (Windows et / ou Linux seraient utiles)

Marina
la source

Réponses:

146

C'est un service Web SOAP standard et ordinaire. SSH n'a rien à faire ici. Je viens de l'appeler avec (bon mot):

$ curl -X POST -H "Content-Type: text/xml" \
    -H 'SOAPAction: "http://api.eyeblaster.com/IAuthenticationService/ClientLogin"' \
    --data-binary @request.xml \
    https://sandbox.mediamind.com/Eyeblaster.MediaMind.API/V2/AuthenticationService.svc

Où le request.xmlfichier a le contenu suivant:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://api.eyeblaster.com/">
           <soapenv:Header/>
           <soapenv:Body>
              <api:ClientLogin>
                 <api:username>user</api:username>
                 <api:password>password</api:password>
                 <api:applicationKey>key</api:applicationKey>
              </api:ClientLogin>
          </soapenv:Body>
</soapenv:Envelope>

J'obtiens ce beau 500:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode>s:Security.Authentication.UserPassIncorrect</faultcode>
      <faultstring xml:lang="en-US">The username, password or application key is incorrect.</faultstring>
    </s:Fault>
  </s:Body>
</s:Envelope>

As-tu essayé ?

Lire la suite

Tomasz Nurkiewicz
la source
6
+1 soapui, un outil très utile et gratuit pour travailler avec des services Web à base de savon. Beaucoup mieux que d'utiliser la ligne de commande IMHO.
Analyse floue
Quelle version de curl utilisez-vous? Le mien dit "Impossible de résoudre l'hôte '--data-binary', et que https est un" protocole non pris en charge ".
Marina
Si je fais exactement ce que vous avez fait, alors j'obtiens toujours une erreur de mediamind qui dit qu'une "erreur de serveur interne inattendue s'est produite". Y a-t-il quelque chose que vous n'avez pas inclus dans la réponse que je devrais faire (en plus de remplacer la clé un / pw / par les vraies)?
Marina du
@Marina: maintenant j'obtiens également " 500 Internal Server Error ". Cependant, il s'agit d'une erreur côté serveur, pas la nôtre (?), Demandez au fournisseur WS ce qui se passe. Il fonctionnait il y a quelques jours.
Tomasz Nurkiewicz
Merci pour votre réponse. Il y a une enveloppe / manquante dans request.xml, provoquant une réponse d'erreur du serveur. Une fois, j'ai ajouté que cela fonctionnait bien. C'est peut-être le problème pour d'autres personnes qui obtiennent des erreurs.
apadana
24

Sur la ligne de commande Linux, vous pouvez simplement exécuter:

curl -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction:"  -d @your_soap_request.xml -X POST https://ws.paymentech.net/PaymentechGateway
linuxeasy
la source
13

Utilisation de CURL:

SOAP_USER='myusername'
PASSWORD='mypassword'
AUTHENTICATION="$SOAP_USER:$PASSWORD"
URL='http://mysoapserver:8080/meeting/aws'
SOAPFILE=getCurrentMeetingStatus.txt
TIMEOUT=5

Demande CURL:

curl --user "${AUTHENTICATION}" --header 'Content-Type: text/xml;charset=UTF-8' --data @"${SOAPFILE}" "${URL}" --connect-timeout $TIMEOUT

J'utilise ceci pour vérifier la réponse:

http_code=$(curl --write-out "%{http_code}\n" --silent --user "${AUTHENTICATION}" --header 'Content-Type: text/xml;charset=UTF-8' --data @"${SOAPFILE}" "${URL}" --connect-timeout $TIMEOUT --output /dev/null)
if [[ $http_code -gt 400 ]];  # 400 and 500 Client and Server Error codes http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
then
echo "Error: HTTP response ($http_code) getting URL: $URL"
echo "Please verify parameters/backend. Username: $SOAP_USER Password: $PASSWORD Press any key to continue..."
read entervalue || continue
fi
gogasca
la source
2
$ USERNAME résout mon nom d'utilisateur Linux, changé en $ USER dans mes scripts
DmitrySandalov
12

Voici un autre exemple de demande CURL - SOAP ( WSDL ) pour les codes swift bancaires

Demande

curl -X POST http://www.thomas-bayer.com/axis2/services/BLZService \
  -H 'Content-Type: text/xml' \
  -H 'SOAPAction: blz:getBank' \
  -d '
  <soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:blz="http://thomas-bayer.com/blz/">
    <soapenv:Header/>
    <soapenv:Body>
      <blz:getBank>
        <blz:blz>10020200</blz:blz>
      </blz:getBank>
    </soapenv:Body>
  </soapenv:Envelope>'

Réponse

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/xml;charset=UTF-8
< Date: Tue, 26 Mar 2019 08:14:59 GMT
< Content-Length: 395
< 
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <ns1:getBankResponse
      xmlns:ns1="http://thomas-bayer.com/blz/">
      <ns1:details>
        <ns1:bezeichnung>BHF-BANK</ns1:bezeichnung>
        <ns1:bic>BHFBDEFF100</ns1:bic>
        <ns1:ort>Berlin</ns1:ort>
        <ns1:plz>10117</ns1:plz>
      </ns1:details>
    </ns1:getBankResponse>
  </soapenv:Body>
</soapenv:Envelope>
bmatovu
la source
1
+1 pour indiquer plusieurs lignes d'en-tête (un autre -H), et comme il est bien de les avoir toutes au même endroit. Travaillé dans le contexte SAP.
jusqu'au
5
curl --header "Content-Type: text/xml;charset=UTF-8" --header "SOAPAction:ACTION_YOU_WANT_TO_CALL" --data @FILE_NAME URL_OF_THE_SERVICE 

La commande ci-dessus m'a été utile

Exemple

curl --header "Content-Type: text/xml;charset=UTF-8" --header "SOAPAction:urn:GetVehicleLimitedInfo" --data @request.xml http://11.22.33.231:9080/VehicleInfoQueryService.asmx 

Plus d'informations

Technicien
la source
3

Pour les utilisateurs de Windows à la recherche d'une alternative à PowerShell, la voici (en utilisant POST). Je l'ai divisé en plusieurs lignes pour plus de lisibilité.

$url = 'https://sandbox.mediamind.com/Eyeblaster.MediaMind.API/V2/AuthenticationService.svc'
$headers = @{
    'Content-Type' = 'text/xml';
    'SOAPAction' = 'http://api.eyeblaster.com/IAuthenticationService/ClientLogin'
}
$envelope = @'
    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <yourEnvelopeContentsHere/>
        </Body>
    </Envelope>
'@     # <--- This line must not be indented

Invoke-WebRequest -Uri $url -Headers $headers -Method POST -Body $envelope
JamesQMurphy
la source
2

Pour les fenêtres:

Enregistrez ce qui suit sous MSFT.vbs:

set SOAPClient = createobject("MSSOAP.SOAPClient")
SOAPClient.mssoapinit "https://sandbox.mediamind.com/Eyeblaster.MediaMind.API/V2/AuthenticationService.svc?wsdl"
WScript.Echo "MSFT = " & SOAPClient.GetQuote("MSFT")

Ensuite, à partir d'une invite de commande, exécutez:

C:\>MSFT.vbs

Référence: http://blogs.msdn.com/b/bgroth/archive/2004/10/21/246155.aspx

Analyse floue
la source
1
Cette année 2004, la technique échoue au moins sur Windows 7.
Aram Paronikyan
2

Pour Windows, j'ai trouvé que cela fonctionnait:

Set http = CreateObject("Microsoft.XmlHttp")
http.open "GET", "http://www.mywebservice.com/webmethod.asmx?WSDL", FALSE
http.send ""
WScript.Echo http.responseText

Référence: CodeProject

Aram Paronikyan
la source