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 FunctionSi 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 Suby 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 SubSOAP 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 SubSOAP 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 SubEn 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: 
			
		
	
								
								
									
	
								
							
							 
				 
 
		 
 
		 
 
		 
 
		 
			 
 
		 
 
		 
 
		 
 
		 
 
		