Autor Tema: clsHttpRequests: Clase que envia Requests de forma asincronica con threads (r6)  (Leído 11027 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ton

  • Bit
  • Mensajes: 9
  • Reputación: +0/-0
    • Ver Perfil
Hola coco y demas compañeros, muy interesante la clase...

Te comento lo siguiente, yo consumo un web service, y uso xmlhttrequest de la siguiente manera, ahora como podria yo, con ésta clase, enviarle al usuario un aviso (un form, un gif de esos tipo web "loading",) ó algo que me indique que se esta procesando la solicitud...?? pido mucho?? gracias!!

Dim oHttReq As XMLHTTPRequest
Set oHttReq = New XMLHTTPRequest

urlPOST = "https://test.consultauser.com.mx/wsconsultaiduser.asmx"

oHttReq.Open "POST", urlPOST, False 'Aqui tendria que poner a true

oHttReq.Send sXml 'al hacer esto aqui es donde se me congela por unos segundos el equipo.

'sXML es un String que contiene el XML con los datos de usuario y contraseña y ademas la informacion que envio al Ws.

If oHttReq.Status = 200 Then
    ' este será el texto recibido del servicio Web
    resultWs = procesarRespuesta(oHttReq.responseText)
Else
    MsgError = "Error Codigo de Estado Web Service Status: " & oHttReq.Status & ": " & oHttReq.statusText & "
   resultWs = False
End If

Set oHttReq = Nothing






coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Fijate en los eventos de la clase... Te avisa cuando termina o hay un error.
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

xxdoc

  • Bytes
  • *
  • Mensajes: 20
  • Reputación: +0/-0
    • Ver Perfil
Buenas a todos!

version: REVISION 6 (21/febrero/14)!!!!

El martes me surgio la idea de enviar un HTTP POST de forma asincronica, y no encontre nada piola.
Hablando con Cobein se me ocurrio el de utilizar un codigo que use el HttpCreateRequest y HttpSendRequest, pero que la llamada bloqueante (HttpSendRequest) se haga en un thread aparte.
Ahora, la magia reside en que la parte "heavy" se hace en VB, mientras que en el thread solo se hace la llamada a HttpSendRequest y a SendMessageTimeout (para avisarle al thread 'main' que ya termino la ejecucion).
El codigo del thread esta hecho 100% en assembly (ver asm.asm). En dicho archivo, se ven unos pushs y unos llamados a cualquier lugar (fuera de joda, lo hice aproposito). La gracia de eso, es que el codigo en VB va a parchear eso, con llamadas a direcciones validas (la del HttpSendRequest y SendMessageTimeout), como asi tambien, reemplazar las "constantes" del hWnd de la ventana, y el uMsg custom. (la clase crea una ventana oculta para recibir los mensajes del thread, y el mensaje es uno custom, creado con RegisterWindowMessage).

La logica es sencilla. Se llama a la funcion SendRequest o SendRequest_OptionalAsByte con todos los parametros, inclusive el "private key", que seria un string para identificar los eventos (la diferencia radica en que la primera, el parametro opcional lpOptional es interpretado en base a un string, y en la segunda, es un array de bytes y precisa que se le pase el tamaño del mismo).
Tambien hay un parametro de Timeout.

Los demas parametros conforman a los que uno usaria al llamar a InternetConnect y HttpCreateRequest.

Hay varias enums de flags y demas, para usar en esas llamadas, o en QueryInfoAsXXXXX (puede ser AsLong, AsDate, AsString).

QueryInfoAsXXXX consulta algun parametro dentro del header y lo devuelve, segun el formato elegido (leer el msdn para saber si usar Long, Date o String). La funcion acomoda el tamaño del string automaticamente.

Luego quedan las funciones DumpRequestToBuffer, DumpRequestToString y DumpRequestToFile (todas estas leen el resultado del Request, y lo devuelven de maneras distintas).

Tambien hay una funcion mas, CancelRequest, la cual se podria llamar para cancelar un Request que se esta ejecutando.

Eventos: RequestDone (cuando HttpSendRequest termina), RequestCancelled (cuando es cancelado por el usuario), RequestTimeout (cuando hay timeout)

En el ejemplo hay 3 botones.
1º Descarga el google a googlex.html
2º Descarga 10 veces el google a google_xx.html
3º Envia un POST a un php en un host mio, que solamente devuelve el parametro "q"



  • rev1: Ahora la cantidad maxima de request esta limitada (para prevenir arrays locks); Se volo a la mierda el PostMessage y se reemplazo por el
    SendMessageTimeout (espera hasta que el thread main le responda); Se corrigieron unos leaks de handles (faltaba cerrar el hRequest)
  • rev2: Se corrigio el leak de handles (no se cerraba el objeto thread)
  • rev3: Se agrego la opcion de "Esperar a que terminen todos los threads". Esto es importante, porque antes se deallocaba la memoria de los threads, y si estos aun estaban activos, iba a surgir un error de "Memory access violation". Ademas le agregue el evento del WM_TIMER, que me lo habia olvidado y no estaba funcionando la parte del timeout.
  • rev4: Se agrego el soporte para SSL y Proxy. Se removieron muchos parametros y ahora solo se pasa una URL. Ahora en los eventos aparece el LastError del thread, el cual indica porque fallo el API. El "esperar a que los threads terminen" es una propiedad que puede ser cambiada en runtime (en IDE es 100% necesario!!!).
  • rev5: Se arreglo DumpRequestToString y DumpRequestToBufer, el cual escribia en un pedazo de memoria que no correspondia.
  • rev6: Se modificaron algunos eventos y propiedades para que el control se parezca mas al WinHTTP. Se agregó toda la logica de InternetReadFile en el thread, de forma que el thread de VB no se bloquea mas (ya que InternetReadFile bloquea).

(el link siempre es el mismo para LA ULTIMA VERSION)
DESCARGAR rev6

Cualquier cosa los escucho...
Saludos!!!

maybe,i want ask can used cookie?and management cookie?

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
@xxdoc:
You can use Cookies, just set them as a header. To do that, add the extra headers in the send request, just like "Cookie name=value".
I don't know what it is a management cookie, but if it is the same as a cookie, then its possible
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion