Espero que este post anime a otros usuarios a compartir con el resto de foreros de la comunidad, sus "descubrimientos", resultado de su árdua busqueda en multitud de hilos y medias respuestas que supone muchas veces resolver un dilema.
También seria importante que os tomarais un minuto en leer
http://www.b4x.com/android/forum/threads/indice-de-temas-con-solucionado.44948/ con el fin de mejorar nuestra comunidad.
En mi caso me gustaria explicaros la solución a la que he llegado, sobre las posibilidades de como consumir un webservices del tipo .asmx (asp.net). Agraceceria cualquier comentario que mejorase el codigo o sugerencia, ya que esto simplemente son mis conclusiones.
Un ejemplo seria acceder a un webservice tipo "Helloword" cuyo código podría ser:
Si el explorador del servidor donde reside el webservice ponemos "http://www.miweb.com/nombredelwebservice.asmx?op=HelloWorld" accederemos al test form de este webservice y observaremos que los protocolos disponibles para acceder al webmethod son HTTP POST, HTTP GET, SOAP 1.1, and SOAP 1.2. Aclarar que también es posible remotamente, pero el webservice debe estar configurado para que lo permita.
Con B4a podemos acceder mediante los cuatro protocolos
HTTP POST:
El formato de petición/respuesta del webmethod seria:
El codigo seria:
y para la obtener la respuesta utilizaríamos el método jobdone
HTTP GET
El formato requerido seria:
Y nuestra llamada podria ser:
SOAP 1.2
El formato requerido seria:
En este caso es un poco mas laborioso ya que debemos construir un string con el formato XML idéntico al solicitado, substituyendo el marcador (placeholders) nombre por el valor deseado
SOAP 1,1
Este caso seria similar al SOAP 1,2 descrito anteriomente, simplemente con las adaptaciones oportunas, por lo que no lo desarrollo
Ahora nos faltaría interceptar la respuesta del servidor.
Para ello utilizaríamos el procedimiento jobdone, en el cual dependiendo del nombre utilizado al inicializar la variable job, puedo discernir la respuesta recibida.
En el "JOPSOAP" utilizo la función xmlGetTagContent que devuelve el valor situado entre las etiquetas (tags) del xml recibido como respuesta, que no son mas que los parámetros que devuelve el webmethod. Esta función la encontré en http://www.b4x.com/android/forum/threads/soap-textbox-info.19961/
En el “JOBPOST” y “JOBSET” obtengo el resultado buscando la subcadena siendo el numero XX de caracteres contados a partir del "<string xmlns=" hasta encontrar el “string” (<string xmlns="http://www.miweb.com/">string</string>) que es la respuesta del webservice. Seguro que hay una manera mas elegante, y agradeceria cualquier colaboración para optimizar esta sentencia
También seria importante que os tomarais un minuto en leer
http://www.b4x.com/android/forum/threads/indice-de-temas-con-solucionado.44948/ con el fin de mejorar nuestra comunidad.
En mi caso me gustaria explicaros la solución a la que he llegado, sobre las posibilidades de como consumir un webservices del tipo .asmx (asp.net). Agraceceria cualquier comentario que mejorase el codigo o sugerencia, ya que esto simplemente son mis conclusiones.
Un ejemplo seria acceder a un webservice tipo "Helloword" cuyo código podría ser:
B4X:
<WebMethod()> _
Public Function HelloWorld(Nombre As String) As String
Return "Hola " + Nombre
End Function
Si el explorador del servidor donde reside el webservice ponemos "http://www.miweb.com/nombredelwebservice.asmx?op=HelloWorld" accederemos al test form de este webservice y observaremos que los protocolos disponibles para acceder al webmethod son HTTP POST, HTTP GET, SOAP 1.1, and SOAP 1.2. Aclarar que también es posible remotamente, pero el webservice debe estar configurado para que lo permita.
Con B4a podemos acceder mediante los cuatro protocolos
HTTP POST:
El formato de petición/respuesta del webmethod seria:
B4X:
GET /nombredelwebservice.asmx/HelloWorld?Nombre=string HTTP/1.1
Host: XXX.XXX.XXX.XXX
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.miweb.com/">string</string>
El codigo seria:
B4X:
Sub ConsumirServiciPOST(Nombre As String)
Dim job1 As HttpJob
Dim Parametres As String
Parametros= "Nombre=" & Nombre
job1.Initialize("JOBPOST", Me)
job1.PostString ("www.miweb.com/nombredelwebservice.asmx/HelloWorld", Parametros)
End Sub
y para la obtener la respuesta utilizaríamos el método jobdone
HTTP GET
El formato requerido seria:
B4X:
POST /nombredelwebservice.asmx/HelloWorld HTTP/1.1 Host: XXX.XXX.XXX.XXX Content-Type: application/x-www-form-urlencoded
Content-Length: length
Nombre=string
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.miweb.com/">string</string>
Y nuestra llamada podria ser:
B4X:
Sub ConsumirServiciGET(Nombre As String)
Dim job As HttpJob
Dim Parametres As String
Parametros= "Nombre=" & Nombre
job.Initialize("JOBSET", Me)
job.PostString("www.miweb.com/nombredelwebservice.asmx/HelloWorld", Parametros)
End Sub
SOAP 1.2
El formato requerido seria:
B4X:
POST /miwebservice.asmx HTTP/1.1 Host:XXX.XXX.XXX.XXX
Content-Type: application/soap+xml; charset=utf-8 Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<HelloWorld xmlns="http://www.miweb.com/">
<Nombre>string</Nombre>
</HelloWorld>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<HelloWorldResponse xmlns="http://www.miweb.com/">
<HelloWorldResult>string</HelloWorldResult>
</HelloWorldResponse>
</soap12:Body>
</soap12:Envelope>
En este caso es un poco mas laborioso ya que debemos construir un string con el formato XML idéntico al solicitado, substituyendo el marcador (placeholders) nombre por el valor deseado
B4X:
Sub ConsumirServiciSOAP(Nombre As String)
Dim job1 As HttpJob
Dim XML As String
XML = ""
XML = XML & "<?xml version='1.0' encoding='utf-8'?>"
XML = XML & "<soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'>"
XML = XML & "<soap12:Body>"
XML = XML & "<HelloWorld xmlns='http://www.miweb.com/'>"
XML = XML & "<Nombre>" & Nombre & "</Nombre>"
XML = XML & "</HelloWorld>"
XML = XML & "</soap12:Body>"
XML = XML & "</soap12:Envelope>"
XML = XML.Replace("'", Chr(34))
job1.Initialize("JOBSOAP", Me)
job1.PostString ("www.miweb.com/nombredelwebservice.asmx", XML)
job1.GetRequest.SetContentType("application/soap+xml")
End Sub
SOAP 1,1
Este caso seria similar al SOAP 1,2 descrito anteriomente, simplemente con las adaptaciones oportunas, por lo que no lo desarrollo
Ahora nos faltaría interceptar la respuesta del servidor.
Para ello utilizaríamos el procedimiento jobdone, en el cual dependiendo del nombre utilizado al inicializar la variable job, puedo discernir la respuesta recibida.
B4X:
Sub JobDone (Job AsHttpJob)
If Job.Success Then
Dim Res AsString
Res = Job.GetString
Select Job.JobName
Case"JOBSOAP"
Dim resultat As String
resultat = xmlGetTagContent(Res,"HelloWorldResult")
Msgbox(resultat,"resultat")
Case"JOBPOST"
Dim resultat As String
resultat = Res.SubString2(Res.IndexOf("<string xmlns=") + XX, Res.IndexOf("</string>"))
Msgbox(resultat,"resultat")
Case"JOBSET"
resultat = Res.SubString2(Res.IndexOf("<string xmlns=") + XX, Res.IndexOf("</string>"))
Msgbox(resultat,"resultat")
EndSelect
Else
Msgbox( Job.errormessage , "Error")
EndIf
Job.Release
End Sub
En el "JOPSOAP" utilizo la función xmlGetTagContent que devuelve el valor situado entre las etiquetas (tags) del xml recibido como respuesta, que no son mas que los parámetros que devuelve el webmethod. Esta función la encontré en http://www.b4x.com/android/forum/threads/soap-textbox-info.19961/
En el “JOBPOST” y “JOBSET” obtengo el resultado buscando la subcadena siendo el numero XX de caracteres contados a partir del "<string xmlns=" hasta encontrar el “string” (<string xmlns="http://www.miweb.com/">string</string>) que es la respuesta del webservice. Seguro que hay una manera mas elegante, y agradeceria cualquier colaboración para optimizar esta sentencia
Last edited: