Spanish ENVIAR VARIOS REGISTROS A WEB SERVICE

felixjavierdiaz

Member
Licensed User
Longtime User
Hola a todos...

Si alguien me puede ayudar les agradezco.

Yo tengo un Web service al cual necesito enviar varios registros que tengo almacenados en la base de datos, pero necesito enviar uno a uno esperando una respuesta de cada registro enviado.
Al realizar un for y enviar los datos lo hace de una manera muy rapida y no puedo controlar la respuesta de cada registro enviado y se me pierden dichos registros.
Es decir necesito enviar un registro y esperar la confirmación del mismo, una vez tenga dicha confirmación poder seguir con el siguiente registro y asi sucesivamente hasta enviar todos los registros.

Este es el codigo que estoy utilizando

Sub Bclientes_Click
Dim cadena As String
URL = "http://tableroeca.sytes.net:81/conelec/conelec_ws.dll/dato_clientes?"
Dim request As HttpRequest
For i = 0 To 5
HttpClient1.Initialize("HttpClient1")
acta = "1"&i
cadena = "ACTA=1"&i&"&ORDEN=O"&i& "&OBS=OBS"&i& "&LECTURA=L"&i
cadena = cadena.Replace(" ", "%20")
request.InitializeGet(URL&cadena)
request.Timeout = 10000
HttpClient1.Execute(request, 1)= False Then Return
Next
End Sub

Gracias de antemano a los que me puedan colaborar.

Saludos,

fdm
 

jota

Active Member
Licensed User
Longtime User
Cambia esta linea por HttpClient1.Execute(request, i) y en Sub HttpClient1_ResponseSuccess (Response As HttpResponse, TaskId As Int) podras usar un Select...Case contra TaskId siendo TaskId el valor de i que hayas enviado.
 

felixjavierdiaz

Member
Licensed User
Longtime User
Gracias por tu explicacion. pero me podrias explicar un poco mas sobre el select... case la verdad no entendi esa parte.
 

jota

Active Member
Licensed User
Longtime User
Cuando usas el httpclient1.execute(request,1) el 1 que pones es el TaskId asi que cuando recibes la respuesta en _ResponseSuccess(Response As HttpResponse, TaskId As Int) o en _ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int) tienes el parametro TaskId para diferenciar el trabajo que has enviado al webservice. Lo del select...case es una opcion para tratar la información recibida pero no es imprescindible. Espero que esta explicación sea mejor sino me lo dices sin problemas :)
 

felixjavierdiaz

Member
Licensed User
Longtime User
Ok Gracias.
El detalle es el siguiente: Cuando envío un dato debo esperar una respuesta. y lo que necesito es no enviar el siguiente dato hasta no recibir la respuesta.
Yo recorro la consulta con un for y voy enviando la información una a una. debo recibir la respuesta, ejecutar una acción y luego enviar el siguiente dato.

Es el detalle de un pedido en donde tengo varios ítem de dicho pedido, pero necesito controlar y no enviar el siguiente ítem hasta no haber recibido la confirmación del primer ítem y luego del segundo y asi sucesivamente.

Yo en Windows Mobile envío el request = HTTP_GET(servidor, dato) y alli mismo recibo la respuesta y después de enviar el dato hago un delay y espero la respuesta y despues es que hago el next.

Agradezco tu colaboración.

felix diaz
 

jota

Active Member
Licensed User
Longtime User
Yo en estos casos hago una "cache" en un list en tu caso metiendo el contenido de la variable request y a medida que voy enviando y recibiendo la respuesta del server voy vaciando el contenido del list en _ResponseSuccess(Response As HttpResponse, TaskId As Int)
 

felixjavierdiaz

Member
Licensed User
Longtime User
Si pero como hago para no avanzar al siguiente registro hasta no tener la confirmacion de recibido del servidor?
 

jota

Active Member
Licensed User
Longtime User
Con tu codigo te he montado este ejemplo para que pilles la idea, el codigo es muy mejorable pero creo que asi me explicare mejor

B4X:
Sub Bclientes_Click
    'Supongo que el evio son 5 pasos
    Dim cadena As String
    URL = "http://tableroeca.sytes.net:81/conelec/conelec_ws.dll/dato_clientes?"
   
    HttpClient1.Initialize("HttpClient1")
    acta = "1"&i
    cadena = "ACTA=1"&i&"&ORDEN=O"&i& "&OBS=OBS"&i& "&LECTURA=L"&i
    cadena = cadena.Replace(" ", "%20")
    request.InitializeGet(URL&cadena)
    request.Timeout = 10000
    HttpClient1.Execute(request, 1)    'Lanzo el primer envio
End Sub

Sub HttpClient1_ResponseSuccess (Response As HttpResponse, TaskId As Int)   
    Select TaskId
        Case 1
            'Recibo respuesta del primer envio y lanzo el segundo                                               
            request.InitializeGet(UrlSegundoEnvio)
            HttpClient1.Execute(request, 2)    'Lanzo el segundo envio
        Case 2
            'Recibo respuesta del segundo envio y lanzo el tercero
            request.InitializeGet(UrlTercerEnvio)
            HttpClient1.Execute(request, 3)    'Lanzo el tercer envio
        Case 3
            'Recibo respuesta del tercer envio y lanzo el cuarto
            request.InitializeGet(UrlCuartoEnvio)
            HttpClient1.Execute(request, 4)    'Lanzo el cuarto envio
        Case 4
          'Recibo respuesta del cuarto envio y lanzo el quinto y ultimo envio
              request.InitializeGet(UrlQuitoEnvio)
            HttpClient1.Execute(request, 5)    'Lanzo el quinto y ultimo envio
        Case 5
            Msgbox("Pedido enviado y conforme","")
    End Select
End Sub

Espero que te sirva. Saludos ;)
 
Top