Cómo hacer una llamada a servicios web SOAP wsdl desde la línea de comandos

92

Necesito hacer una llamada de servicio web SOAP a https://sandbox.mediamind.com/Eyeblaster.MediaMind.API/V2/AuthenticationService.svc?wsdl y usar la operación ClientLogin mientras paso los parámetros: ApplicationKey, Password y UserName . La respuesta es UserSecurityToken. Son todas cuerdas.

Aquí está el enlace que explica completamente lo que estoy tratando de hacer: https://sandbox.mediamind.com/Eyeblaster.MediaMind.API.Doc/?v=3

¿Cómo puedo hacer esto en la línea de comando? (Windows y / o Linux serían útiles)

Puerto pequeño
fuente

Respuestas:

146

Es un servicio web SOAP estándar y ordinario. SSH no tiene nada que hacer aquí. Solo lo llamé con (un trazador de líneas):

$ 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

Donde el request.xmlarchivo tiene el siguiente contenido:

<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>

Obtengo este hermoso 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>

Has probado ?

Lee mas

Tomasz Nurkiewicz
fuente
6
+1 soapui, una herramienta muy útil y gratuita para trabajar con servicios web basados ​​en jabón. Mucho mejor que usar la línea de comando en mi humilde opinión.
Análisis difuso
¿Qué versión de curl estás usando? El mío dice "No se pudo resolver el host '--data-binary', y que https es un" Protocolo no admitido ".
Marina
Si hago exactamente lo que hiciste, siempre recibo un error de mediamind que dice "Se ha producido un error interno inesperado del servidor". ¿Hay algo que no hayas incluido en la respuesta que debería estar haciendo (además de reemplazar la clave un / pw / con las reales)?
Marina
@Marina: ahora también recibo " 500 Internal Server Error ". Sin embargo, este es un error del lado del servidor, no nuestro (?), Pregunte al proveedor de WS qué está sucediendo. Estuvo funcionando hace unos días.
Tomasz Nurkiewicz
Gracias por tu respuesta. Falta un / Envelope en request.xml, lo que provoca una respuesta de error del servidor. Una vez agregué que funcionó bien. Tal vez ese sea el problema para otras personas que obtienen errores.
Apadana
24

En la línea de comandos de Linux, simplemente puede ejecutar:

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

Usando CURL:

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

Solicitud de CURL:

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

Utilizo esto para verificar la respuesta:

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
fuente
2
$ USERNAME se resuelve en mi nombre de usuario de Linux, cambiado a $ USER en mis scripts
DmitrySandalov
12

Aquí hay otro ejemplo de solicitud CURL - SOAP ( WSDL ) para códigos swift bancarios

Solicitud

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>'

Respuesta

< 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
fuente
1
+1 para indicar varias líneas de encabezado (otra -H), y como es bueno tener todo en una ubicación. Trabajado en contexto SAP.
hasta el
5
curl --header "Content-Type: text/xml;charset=UTF-8" --header "SOAPAction:ACTION_YOU_WANT_TO_CALL" --data @FILE_NAME URL_OF_THE_SERVICE 

El comando anterior fue útil para mí

Ejemplo

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

Más información

Techie
fuente
3

Para los usuarios de Windows que buscan una alternativa de PowerShell, aquí está (usando POST). Lo he dividido en varias líneas para facilitar la lectura.

$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
fuente
2

Para ventanas:

Guarde lo siguiente como 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")

Luego, desde un símbolo del sistema, ejecute:

C:\>MSFT.vbs

Referencia: http://blogs.msdn.com/b/bgroth/archive/2004/10/21/246155.aspx

Análisis difuso
fuente
1
Este año 2004 la técnica falla en Windows 7 al menos.
Aram Paronikyan
2

Para Windows encontré esto funcionando:

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

Referencia: CodeProject

Aram Paronikyan
fuente