Spanish [B4A] [Tutorial ]Como consumir webservice tipo asp.net (asmx)

Xicu

Active Member
Licensed User
Longtime User
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:

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:

Xicu

Active Member
Licensed User
Longtime User
Gracias Heppy, espero que sea util a alguien.
Toda mejora, sugerencia, o comentario sera bien recibida:D
 

Xicu

Active Member
Licensed User
Longtime User
Last edited:

R0BERT0

Member
Licensed User
Longtime User
Vaya, llego un poco tarde, y tenia pensado que fuera mi primer aporte., tengo escrito un codigo muy similar, en mi ejempo el web service devuelve un array de datos, ya te digo que en esencia es exactamente lo mismo, pero bueno, tampoco esta de mas tener los códigos específicos para los mas novatos, copy and paste. ;-)

Muchas gracias por compartirlo, hay que bien m hubiera venido hace algun tiempo ;-)
 

Rene Barrera

Member
Licensed User
Longtime User
Hola, he estado buscando como hacer para convocar un web service para traer la "Temperatura" desde un widget, lo primero fue buscar como traerla usando una aplicación normal y encontré que con SOAP12 se logró exitosamente, anexo el código porque no sé porqué mis aplicaciones las guarda de manera muy pesada (más de 512k) y no suben como archivo. el punto es que con esta aplicación si puedo obtener la información de la temperatura pero al querer hacerlo para un widget solo me contesta que mi servicio se ha detenido. Bueno espero alguien pueda apoyarme, mientras le dejo el código que mencioné. Aparte les anexo también una imagen del layout usado.
Es importante mencionar que ya he solicitado apoyo al foro en inglés y amablemente me contestan, sin embargo, las respuestas son como que más bien tips, pero no sirven de mucho, también les comento que cuando quede resuelto subiré las solución para que esté al alcance de toda la comunidad.
Gracias anticipadas.

B4X:
#Region  Project Attributes
    #ApplicationLabel: TIM_Clima
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
  
    Dim HttpClient1 As HttpClient
End Sub

Sub Globals
  
    Dim URL As String
  Dim XML As String
    Dim Ciudad As String : Ciudad = "acapulco"
    Dim Pais As String   : Pais = "Mexico"
    '''''''''''''''''''''''''''''''''''''''''''''
    Dim lblTemperature As Label
    Dim lblLocation As Label
    Dim lblVisibility As Label
    Dim lblSkyConditions As Label
    Dim lblRelativeHumidity As Label
    Dim imgWeather As ImageView
    '''''''''''''''''''''''''''''''''''''''''''''
    Dim intFin As Int                                        'Indice del fin de búsqueda del string correspondiente
    Dim strResult As String                       'Trae inf del Resultado para validar si se tiene información
  
End Sub

Sub Activity_Create(FirstTime As Boolean)

     Activity.LoadLayout("lyoWeather")
  
   If FirstTime Then
     HttpClient1.Initialize ("HttpClient1")
   End If
   ConsumirServicio
   
End Sub

Sub ConsumirServicio()
     
    Dim Request As HttpRequest
      
    URL = "http://www.webservicex.net/globalweather.asmx"
  
    XML = XML & "<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:web='http://www.webserviceX.NET'>"
    XML = XML & "<soap:Header/>"
    XML = XML & "<soap:Body>"
    XML = XML & "<web:GetWeather>"
    XML = XML & "<web:CityName>" & Ciudad & "</web:CityName>"
    XML = XML & "<web:CountryName>" & Pais & "</web:CountryName>"
    XML = XML & "</web:GetWeather>"
    XML = XML & "</soap:Body>"
    XML = XML & "</soap:Envelope>"
              
  Request.InitializePost2(URL, XML.GetBytes("UTF8"))
  Request.SetHeader("Content-Type", "application/soap+xml; charset=utf-8")                                                                  
  Request.Timeout = 600000 'Setea el tiempo a 60 segundos
  If HttpClient1.Execute(Request, 1) = False Then Return
     
    ProgressDialogShow("Esperando Respuesta...")
   
End Sub

Sub HttpClient1_ResponseSuccess (Response As HttpResponse, TaskId As Int)
 
    ProgressDialogHide
  
  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")
    GetInfo(resultSoapXML)

End Sub

Sub GetInfo(ResultSoapXML As String)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''INI - substrings para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    'Valida si se tiene información para la localidad seleccionada
    strResult = ResultSoapXML.SubString(ResultSoapXML.IndexOf("<GetWeatherResult>")+ 18)
    intFin = strResult.IndexOf("</GetWeatherResult>")
    strResult = strResult.subString2(0, intFin)
  
    If strResult = "Data Not Found" Then
        ToastMessageShow ("No se tiene Información de Temperatura para " & Ciudad & "!", True)
        Activity.Finish   
    End If

    Set_Location(ResultSoapXML)               'Localidad
    Set_Temperature(ResultSoapXML)        'Temperatura
    Set_Visibility(ResultSoapXML)              'Visibilidad
    Set_SkyConditions(ResultSoapXML)      'Condiciones Climáticas
    Set_RelativeHumidity(ResultSoapXML)   'Humedad relativa

'''    'Hora
'''    strTime = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Time&gt;")+ 12)
'''    intFin = strTime.IndexOf("&lt;/Time&gt;")
'''    strTime = strTime.subString2(0, intFin)
'''  
'''    'Wind (Viento)
'''    strWind = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Wind&gt;")+ 12)
'''    intFin = strWind.IndexOf("&lt;/Wind&gt;")
'''    strWind = strWind.subString2(0, intFin)
'''      
'''    'DewPoint (Humedad)
'''    strDewPoint = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;DewPoint&gt;")+ 16)
'''    intFin = strDewPoint.IndexOf("&lt;/DewPoint&gt;")
'''    strDewPoint = strDewPoint.subString2(0, intFin)
'''
'''    'Pressure (presión Atmosférica)
'''    strPressure = ResultSoapXML.SubString(ResultSoapXML.IndexOf("&lt;Pressure&gt;")+ 16)
'''    intFin = strPressure.IndexOf("&lt;/Pressure&gt;")
'''    strPressure = strPressure.subString2(0, intFin)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''FIN - substrings para ir obteniendo la Información del Web Service del Clima'''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Sub

Sub Set_Temperature(Temperatura As String)   'Temperatura

    Temperatura = Temperatura.subString2(Temperatura.IndexOf("&lt;Temperature&gt;")+ 19, Temperatura.IndexOf("&lt;/Temperature&gt;") )
    Temperatura = Temperatura.subString2(Temperatura.IndexOf("(")+ 1, Temperatura.IndexOf("C)") )
    Temperatura = Temperatura & " " &  "°C"
    lblTemperature.Text = Temperatura
  
End Sub

Sub Set_Location(Location As String)   'Localidad

    Location = Location.SubString2(Location.IndexOf("&lt;Location&gt;")+ 16, Location.IndexOf(Pais))
    lblLocation.Text = Location & " " & Pais
  
End Sub

Sub Set_SkyConditions(SkyConditions As String)   'Condiciones Climáticas

    SkyConditions = SkyConditions.SubString2(SkyConditions.IndexOf("&lt;SkyConditions&gt;")+ 21, SkyConditions.IndexOf("&lt;/SkyConditions&gt;"))
      
    Select SkyConditions.Trim
      
        Case "partly cloudy"
            SkyConditions = "Parcialmente Nublado"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "002PartlyCloudy.png")
        Case "mostly cloudy"
            SkyConditions = "Mayormente Nublado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "003MostlyCloudy.png")
        Case "overcast"
            SkyConditions = "Completamente Nublado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "004Overcast.png")
        Case "mostly clear"
            SkyConditions = "Cielo mayormente despejado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "001Clear.png")
        Case "sunny"
            SkyConditions = "Soleado"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "006Sunny.png")
        Case "obscured"
            SkyConditions = "Cielo completamente cubierto de cubes"  
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "005Obcured.png")
        Case  "clear"
            SkyConditions = "Despejado"
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "001Clear.png")
        Case Else
            imgWeather.Bitmap= LoadBitmap(File.DirAssets, "000Weather.png")
              
    End Select

    lblSkyConditions.Text = "Condición Climática: " & SkyConditions
      
End Sub

Sub Set_Visibility(Visibility As String)   'Visibilidad

    Dim dblCantidad As Float         'Cantidad
    Dim strCnvrtMiles_Km As String      'Convierte de Millas a Kilómetros

    dblCantidad = Visibility.SubString2(Visibility.IndexOf("&lt;Visibility&gt;")+ 18, Visibility.IndexOf("mile"))
    Visibility = Visibility.SubString(Visibility.IndexOf("&lt;Visibility&gt;")+ 18)
    Visibility = Visibility.SubString2(Visibility.IndexOf(":"), Visibility.IndexOf("&lt;/Visibility&gt;"))
    strCnvrtMiles_Km = 1.6093470879 * dblCantidad 'Una Milla equivale a 1.6093470879 Km
    strCnvrtMiles_Km = NumberFormat(strCnvrtMiles_Km, 1, 2)
    lblVisibility.Text = "Visibilidad: " & strCnvrtMiles_Km & " Km " & Visibility
  
End Sub

Sub Set_RelativeHumidity(RelativeHumidity As String)   'Temperature (Temperatura)

    RelativeHumidity = RelativeHumidity.SubString2(RelativeHumidity.IndexOf("&lt;RelativeHumidity&gt;")+ 24, RelativeHumidity.IndexOf("&lt;/RelativeHumidity&gt;"))
    lblRelativeHumidity.Text = "Humedad Relativa:  " & RelativeHumidity
  
End Sub

Sub HttpClient1_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)  

    ProgressDialogHide
  Dim resultSoapXML As String
  
  resultSoapXML = Response.GetString("UTF8")

    Msgbox(resultSoapXML,"")

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
 

Attachments

  • lyoWeather.png
    lyoWeather.png
    32.1 KB · Views: 705

Xicu

Active Member
Licensed User
Longtime User
Te aconsejaria que abrieses un nuevo hilo planteando este problema, ya que de esta forma tu pregunta quedaria a la vista de la comunidad. En cambio dentro del tutorial, unicamente la veran aquellos que casualmente entren buscando informacion de como consumir un webservice aspx. Ademas creo que tu problema no es en si el consumir el webservice, ya que si no he entendido mal te funciona en si. Parece ser mas un problema con modulo de servicio (nada que ver con el webservice, no confundir) que tienes implementado con el wiwidget. Por tanto te aconsejo leer el tutorialhttp://www.b4x.com/android/forum/forums/spanish-forum.12/
Aqui te explica que el propio sistema puede detener un servicio, y como puede solucionarse
 

Rene Barrera

Member
Licensed User
Longtime User
Te aconsejaria que abrieses un nuevo hilo planteando este problema, ya que de esta forma tu pregunta quedaria a la vista de la comunidad. En cambio dentro del tutorial, unicamente la veran aquellos que casualmente entren buscando informacion de como consumir un webservice aspx. Ademas creo que tu problema no es en si el consumir el webservice, ya que si no he entendido mal te funciona en si. Parece ser mas un problema con modulo de servicio (nada que ver con el webservice, no confundir) que tienes implementado con el wiwidget. Por tanto te aconsejo leer el tutorialhttp://www.b4x.com/android/forum/forums/spanish-forum.12/
Aqui te explica que el propio sistema puede detener un servicio, y como puede solucionarse
Hola Xicu, gracias pr el consejo, voy a abrir un nuevo post, muchas gracias.
 

Rene Barrera

Member
Licensed User
Longtime User
Hola Xicu, gracias pr el consejo, voy a abrir un nuevo post, muchas gracias.

Hola Xicu,

Solo para comentarte que use tu ejemplo de arriba (SOAP 1.2) y me funcionó perfecto en la aplicación, ahora cuando trato de implementarlo en un widget, ya no me da la información. En un post que envié me parece que fue ésta semana, El Sr. Erel me indicó que mi widget no funcionará usando HttpClient y me sugirió usar httputils2. Estos últimos tres días estuve buscando la forma de hacerlo como me lo indicaban y por fin hoy logré implementarlo con tu ejemplo (SOAP 1.2).
Anexo ambos proyectos, el de la aplicación que me funcionó correctamente y el widget que no me funciona, solicito tu apoyo a ver si pudieras dedicarle unos cuantos minutitos para verlos y pudieras por favor decirme en donde estoy mal.
Por otro lado te comento que estoy de acuerdo con tu comentario respecto que a veces solo obtenemos respuestas (hilos) a medias del foro, hoy creo que perturbe la paciencia del Sr. Don Manfred (del foro).
Voy a agradecer tu apoyo infinitamente, por cierto ya dejo en el foro el proyecto de la aplicación (que usa httputils2 para consumir un servicio web de Clima usando el protocolo SOAP1.2) por si a alguien más le sirve, si se logra echar a andar el proyectito del widget también se quedará en el foro para futuras consultas y ahorrar tiempo.

Saludos
 

Attachments

  • APP Using httpUtils2-soap.zip
    374.7 KB · Views: 775
  • WIDGET Using HttpUtils2-Soap12.zip
    399.6 KB · Views: 635

Rene Barrera

Member
Licensed User
Longtime User
Hol
Te aconsejaria que abrieses un nuevo hilo planteando este problema, ya que de esta forma tu pregunta quedaria a la vista de la comunidad. En cambio dentro del tutorial, unicamente la veran aquellos que casualmente entren buscando informacion de como consumir un webservice aspx. Ademas creo que tu problema no es en si el consumir el webservice, ya que si no he entendido mal te funciona en si. Parece ser mas un problema con modulo de servicio (nada que ver con el webservice, no confundir) que tienes implementado con el wiwidget. Por tanto te aconsejo leer el tutorialhttp://www.b4x.com/android/forum/forums/spanish-forum.12/
Aqui te explica que el propio sistema puede detener un servicio, y como puede solucionarse

Hola Xicu,

Solo escribo para informar que ya está resuelto el problema que tenía para correr el Widget, éste se resolvió usando el ejemplo que pusiste arriba del protocolo SOAP12 que usa HttpUtils2, ya que el Sr. Erel me indicó que el mi widget no correría usando HttpClient en Android 4+, así que usé tu ejemplo y ahora el widget funciona correctamente.
Caso cerrado

Muchas Gracias
 

quaker

Member
Licensed User
Longtime User
Buenas XICU.

Gracias por servir de base al tutorial que he realizado.

He mejorado creo que bastante la opción inicial que tu planteabas,pues básicamente,lo he automatizado casi todo.(me falta una parte final de mapeo de modelo .NET a Modelo Android,una vez parseado el XML.Es lo siguiente que hare en la version 1.1).

Os dejo el enlace,pues creo que os ahorrara mas de un dolor de cabeza y sobre todo tiempo(y en muchos casos dinero)

Acordaros de XICU y de mi si lo utilizais ^^ :

https://www.b4x.com/android/forum/t...parse-and-redirect-to-activity-service.55333/

Un saludo.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Buen trabajo Xicu, y gracias por compartir.

Saludos
 

Pilar-JLSineriz

Active Member
Licensed User
Longtime User
Hola a todos.. desesperada. estoy iniciando una aplicación que utiliza una base de datos SQLite. No se si tengo la posibilidad de poner un botón con un comando, que me transforme ese fichero SQlite en un fichero SQL que pueda leer un servidor con SQL. La tablet no va a tener conexión con el servidor, con lo cual tengo que generar un fichero que luego pueda importar el Servidor con SQL. No tengo ni idea de como hacerlo, al final es implementar la función que tiene SQLite Browser para exportar a sql en B4A. Muchas gracias
 

quaker

Member
Licensed User
Longtime User
Hola a todos.. desesperada. estoy iniciando una aplicación que utiliza una base de datos SQLite. No se si tengo la posibilidad de poner un botón con un comando, que me transforme ese fichero SQlite en un fichero SQL que pueda leer un servidor con SQL. La tablet no va a tener conexión con el servidor, con lo cual tengo que generar un fichero que luego pueda importar el Servidor con SQL. No tengo ni idea de como hacerlo, al final es implementar la función que tiene SQLite Browser para exportar a sql en B4A. Muchas gracias

Normalmente el esquema que se suele seguir para el tema de conexion con el servidor en estos casos es la arquitectura cliente servidor web.

Lo que viene siendo:

ANDROID->SERVICIO WEB(en .NET si se puede para maxima compatiblidad con SQL server)-> BASE DE DATOS SQL SERVER.

De esta forma la tablet no tiene conexion con el servidor directamente,pero si el servicio web.

*Android podria estar en una direccion ip de internet XXX.XXX.XXX.XXX
*Android solo deberia conocer la direccion web donde se aloja el servicio web con direccion ip YYY.YYY.YYY.YYY
*La base de datos puede estar en una IP interna ZZZ.ZZZ.ZZZ.ZZZ que android nunca veria,pero que el servidor web si deberia ver.
*El servidor web conectaria mediante el uso de ODBC de Windows,contra el servidor SQL server.Asi desde el servicio web podrias colocar las llamadas correspondientes para hacer las inserts,updates,selects y deletes que necesites o bien ejecutar los procedimientos almacenados de SQL server que necesites.

Esta seria la forma correcta,de realizar tu caso.Podrias apoyarte en la base de datos SQLITE que comentas temporalmente para guardar la información ahí antes de mandarla a traves del servicio web.

Es una idea lo que te propongo, y es la que propondría a cualquier persona que quisiera sacar información del dispositivo android para enviarla a un servidor externo.

Te lo comento mas que nada por que esto que preguntas,yo lo he hecho así,y funciona a la perfección.

Un saludo.
 

Pilar-JLSineriz

Active Member
Licensed User
Longtime User
Muchas gracias... voy a ver si consigo aclararlo un poco más.
Mi tablet coge datos que almaceno en un fichero SQLite. Esos datos irán después a una base de datos en SQL Server. Entiendo que debo hacer un fichero de paso de los datos desde SQLite a SQLServer, pero no se cómo puedo enviar esa información a traves del servicio web y que "no machaque" lo que ya hay en la base de datos SQLServer (update, inserts...)

Gracias de nuevo
 

quaker

Member
Licensed User
Longtime User
Muchas gracias... voy a ver si consigo aclararlo un poco más.
Mi tablet coge datos que almaceno en un fichero SQLite. Esos datos irán después a una base de datos en SQL Server. Entiendo que debo hacer un fichero de paso de los datos desde SQLite a SQLServer, pero no se cómo puedo enviar esa información a traves del servicio web y que "no machaque" lo que ya hay en la base de datos SQLServer (update, inserts...)

Gracias de nuevo

Los pasos a seguir serian:

-1º)Leer de la base de datos SQLITE la informacion a enviar del webservice(hay ejemplos y tutoriales por el foro de como leer desde sqlite,es sencillo).

-2º)La informacion que lees ,la guardas en modelos de datos( presupongo que conoces el termino modelo,sino, informate de patrones MVC y de MVVM en internet)

-3º)Mediante el uso de un servicio,realizas una llamada a un webservice.Este webservice lo puede hacer otra persona o tu misma,pasandole los datos del modelo.Como es SQL SERVER el servidor final de la informacion,recomiendo que dicho webservice sea hecho en C# o en VB.NET, mas que nada por la baja dificultad de conectividad y compatibilidad.Esto aun asi no es obligatorio.

-4º)el webservice se encargara de hacer actualizaciones o inserciones en funcion de lo que llegue(a traves de instrucciones SQL directas,NO RECOMENDADO,o mediante el uso de procedimientos almacenados,RECOMENDADO POR EL CONTROL QUE SE TIENE).

-5º)Android despues de enviar al webservice la informacion,en este caso solo le interesaria si todo ha ido ok o no nada mas(no es un caso que devuelvas informacion compleja y tengas que leerla.

Un saludo!
 

Felix.666

Member
Licensed User
Buenas tardes, estoy probando los webservice, y cuando es por puerto 80, no hay problemas, pero para consumir un webservice por otro puerto ej. 8091, da siempre error interno de servidor
XML = XML & "<HelloWorld xmlns='http://www.miweb.com:8091/'>"
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:8091/nombredelwebservice.asmx", XML)
hay alguna solucion?

Gracias
 
Top