Spanish [SOLUCIONADO] ¿Cómo consultar un webservice SOAP?

vecino

Well-Known Member
Licensed User
Longtime User
Hola, nunca he hecho esto en Android, con otro lenguaje que uso para windows tengo componentes que lo hacen todo "milagrosamente".
He mirado varios hilos y no me entero porque no son muy genéricos, a ver si podéis ayudarme.

Pongamos un ejemplo sencillo, hago una llamada con una divisa y me devuelve el valor de la misma.
url= http://1.2.3.4:8080/wsdl/divisas
método: damevalor( codigodivisa )

¿Podéis ayudarme con un ejemplo sencillo de cómo hacer la llamada?
No sé si hace falta más información para el ejemplo.
Muchas gracias.
 

TILogistic

Expert
Licensed User
Longtime User
?
LEER

nota:
debes indicar mas información si el soap devuelve un JSON o XML
 

vecino

Well-Known Member
Licensed User
Longtime User
Hola, devuelve un xml, gracias.

¿Qué información se necesita? estoy bastante perdido en esto, no sé si hay que hacer una llamada a la url con los parámetros, o si hay que crear un fichero xml, o si hay que usar una biblioteca específica... ni idea.
 
Last edited:

TILogistic

Expert
Licensed User
Longtime User
primero: pruebas tu URL en un navegador web te entrega los detalle de tu Web Service

Asi sabemos como debe llamarse y sus parametros del SOAP.

discusion:

test:

tutorial
 

vecino

Well-Known Member
Licensed User
Longtime User
Hola, ya está solucionado, ha sido gracias a José J. Aguilar que se ha roto la cabeza para darme pistas de por dónde buscar y, principalmente a TILogistic que incluso me ha proporcionado un código que devuelve el resultado esperado, que es este:

B4X:
Dim WSLinkSoap As String = "http://xxx.xxx.xxx.xxx:8050/soap/IwsNewGES2000"
Dim Parameter1 As String = "12345678"
Dim Parameter2 As String = "1"
Dim Parameters As String =  $"<?xml version="1.0" encoding="UTF-8" standalone="no"?>
                                <soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
                                  <soap:Body>
                                    <R_EsReganteOK>
                                      <DNI>${Parameter1}</DNI>
                                      <EMP>${Parameter2}</EMP>
                                    </R_EsReganteOK>
                                  </soap:Body>
                                </soap:Envelope>"$

Wait For(WSCallSoapURL(WSLinkSoap, Parameters)) Complete (XMLResult As String)
If XMLResult.Length = 0 Then Return
Log(XMLResult)

Dim Xml2Map1 As Xml2Map
Xml2Map1.Initialize
Dim mRoot As Map = Xml2Map1.Parse(XMLResult)
Log(mRoot.As(JSON).ToString)
B4X:
Public Sub WSCallSoapURL(URL As String, Parameters As String) As ResumableSub
    Dim Result As String
    Dim j As HttpJob
    Try
        j.Initialize("", Me)
        j.PostString (URL, Parameters)
        j.GetRequest.SetHeader("Content-Type","text/xml")
        j.GetRequest.SetHeader("Content-length", Parameters.Length)
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then
            Result = j.GetString
        Else
            ToastMessageShow("¡Hummm...!",False)
        End If
    Catch
        Log(LastException)
    End Try
    j.Release
    Return Result
End Sub

Muchísimas gracias, amigos.
 

TILogistic

Expert
Licensed User
Longtime User
Para los que usan WEb Service y quieren saber mas de estos servicios.


y referencia a la solución del post de @vecino

 

TILogistic

Expert
Licensed User
Longtime User
Tips
Para crear el Body XML de Request utilize XMLBuilder (esta en la lib XML2MAP)
B4X:
    Dim WSLinkSoap As String = "http://xxx.xxx.xxx.xxx:8050/soap/IwsNewGES2000"
    
    Dim Parameter1 As String = "23760550"
    Dim Parameter2 As String = "1"

    Dim XMLBodySoap As XMLBuilder
    XMLBodySoap = XMLBodySoap.create("soap:Envelope")
    XMLBodySoap = XMLBodySoap.namespace2("soap","http://schemas.xmlsoap.org/soap/envelope/")
    XMLBodySoap = XMLBodySoap.element("soap:Body")
    XMLBodySoap = XMLBodySoap.element("R_EsReganteOK")
    XMLBodySoap = XMLBodySoap.element("DNI").text(Parameter1).up
    XMLBodySoap = XMLBodySoap.element("EMP").text(Parameter2).up
    Dim XMLBodyRequest As String = XMLBodySoap.asString2(CreateMap("indent": "yes"))
    Log(XMLBodyRequest)

    Wait For(WSCallSoapURL(WSLinkSoap, XMLBodyRequest)) Complete (XMLResult As String)
    If XMLResult.Length = 0 Then Return
    Log(XMLResult)
    
    Dim Xml2Map1 As Xml2Map
    Xml2Map1.Initialize
    Dim mRoot As Map = Xml2Map1.Parse(XMLResult)
    Log(mRoot.As(JSON).ToString)

B4X:
Public Sub WSCallSoapURL(URL As String, Parameters As String) As ResumableSub
    Dim Result As String
    Dim j As HttpJob
    Try
        j.Initialize("", Me)
        j.PostString (URL, Parameters)
        j.GetRequest.SetHeader("Content-Type","text/xml; charset=utf-8")
        j.GetRequest.SetHeader("Content-length", Parameters.Length)
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then
            Result = j.GetString
        End If
    Catch
        Log(LastException)
    End Try
    j.Release
    Return Result
End Sub

Result:
1687152911185.png
 
Top