miércoles, abril 02, 2014

Como enviar y recibir datos a través de formularios POST (httpclient httpresponse)

Estimados, quiero compartir mi experiencia en este tema:


Hacer un formulario POST a una web .asp y mostrar datos al usuario:

//Cargar los datos de un HttpClient, ejemplo:
&HttpClient.host = "www.miweb.com"
&HttpClient.base_url = "/form/"

//Cargar las variables en el formulario
&HttpClient.AddVariable('VARIABLE_Cualquiera', 'Valor_de_la_variable')
&HttpClient.AddVariable('VARIABLE_Cualquiera2',
'Valor_de_la_variable2')

//Ejecutar
&HttpClient.Execute('POST', 'pagina.asp')

//Si tengo que mostrar el resultado en pantalla o si el usuario tiene
que interactuar con pagina.asp:
//Inserto un textblock con la propiedad Format:HTML en el webform (el
webform solo va a tener este textblock, nada mas)

TextBlock.Caption = &HttpClient.ToString()


//acá toma el control el main.asp con las variables cargadas

//una vez que el main.asp nos devuelve el control (mediante otro
método POST), debemos capturarlo, para eso, main.asp debe llamar a una
de nuestras páginas, por ejemplo, respuesta.aspx pasandole los
parámetros de respuesta.
//Para eso hacemos un nuevo webpanel con nombre respuesta, y
simplemente en el método start usamos el httprequest

//en respuesta.aspx...
Event Start

        &VARIABLELOCAL =
&httprequest.GetVariable("VARIABLEQUEDEVUELVEELPOST")
        &VARIABLELOCAL2 =
&httprequest.GetVariable("VARIABLEQUEDEVUELVEELPOST2")

EndEvent

Gracias a Cristian Barreto

________________________________________________________________________________

Tipo de Datos HttpClient, HttpResponse y HttpRequest

Introducción

Esta funcionalidad provee a los usuarios GeneXus una forma de poder utilizar el protocolo HTTP en sus programas. Para ello se crearon los tipos de datos HttpClient, HttpResponse y HttpRequest.

Alcance

Objetos: HttpClient (Transacciones, Work Panels, Web Transactions, Web Panels, Reportes, Procedimientos), HttpResponse y HttpRequest (Procedimientos y Reportes con el valor http en la propiedad call protocol, Web Panels y WebTransactions).
Lenguajes: Java – Visual Basic – Visual Fox– C/SQL – C#. 
Interfaces: Web Form, Win Form.

Descripción

Los tres tipos de datos que se definen para interactuar con http son:

HttpClient
Permite armar un request, enviarlo a una URL y leer los resultados.

HttpResponse y HttpRequest
Permiten leer los datos del request y grabar el response. Son objetos disponibles solo en WebProcs.

HttpClient

Este objeto refleja una conexión http. Puede usarse desde cualquier objeto GeneXus.

Propiedades:

      Host
       Define el nombre del host.
      Tipo- String

      Port
      Define el puerto del host.
      Tipo- String

      Secure
      Indica si el protocolo es http o https. 
      Tipo- Boolean

      Timeout
      Determina el Timeout de la conexión.
      Tipo- Integer

      BaseURL
       Indica la URL base de los request que se hagan al host.
      Tipo- String
     
      StatusCode
       Retorna el código de error HTTP.
      Tipo- Integer

      ReasonLine
       Retorna el texto del error HTTP.
      Tipo- String

      ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un valor distinto de cero.
Tipo- Integer

ErrDescription
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String

Basic y Digest
Son constantes que determinan un tipo de autenticación. Se utilizan en el método AddAuthentication.
Basic=0 : Para autentificar se envía el usuario y password sin encriptar.
Digest=1: Para autentificar se envía el usuario y password encriptados.

ProxyHost y ProxyPort
Permiten especificar un proxy http. En ambiente windows se utiliza automáticamente el que esta configurado en la máquina.
ProxyHost- String
ProxyPort- Integer


Métodos

       AddHeader(<Name>, <Value>)
       Agrega un header con el valor dado.
      Ejemplo: AddHeader(“User-Agent”, “GeneXus”)
      <Name>-      String
      <Value>-      String

       AddVariable(<Name>,<Value>)
            Agrega una variable al ‘form’.
Ejemplo: AddVariable(“CliCod”, &CliCod)
      <Name>-      String
      <Value>-      String

       AddString(<Value>)
       Agrega el contenido del string al buffer de datos a enviar.
      <Value>-      String

       AddFile(<Value>)
       Agrega el contenido del archivo al buffer de datos a enviar.
      <Value>-      String

       Execute(<Method>,<URL>)
Ejecuta un método en la URL definida. Se pondría solo la parte final de la URL
Ejemplo: execute("POST", "/servlet/awebproc")
<Method>-        String
<URL>-        String

ToString()
Retorna un String con todo el ‘cuerpo’ del response.

ToFile(<FileName>)
Graba en un archivo el contenido del stream.
<FileName>-        String

GetHeader(<Name>,<Value>)
Retorna en <Value> el valor del header convertido al tipo de la variable.
<Name>-        String
<Value>-         Anytype

AddAuthentication(<Method>, <Realm>, <User>, <Password>)
Se autentifica con <User> y <Password> al dominio <Realm> utilizando el tipo de autenticación <Method>
<Method>- Integer (Pueden utilizarse las propiedades Basic y Digest)
<Realm>- String
<User>- String
<Password>- String

HttpRequest

Este objeto permite leer el request http. Puede instanciarse solo en el contexto de un WebProc.

PROPIEDADES

      Method
       Retorna el método HTTP.
      Tipo- String

      ServerHost
          Retorna el nombre del servidor
          Tipo- String

      ServerPort
       Retorna el puerto en el servidor
      Tipo- Integer

      Secure
Indica si se esta utilizando HTTPS. Si el valor retornado es 1, se esta utilizando HTTPS; si es 0, se esta utilizando http.
Tipo- Integer

ScriptPath
Retorna la porción de URL correspondiente el nombre del directorio virtual.
Tipo- String

ScriptName
Retorna el nombre del objeto con la extensión correspondiente que se esta ejecutando, tal como aparece en la URL
Tipo- String

Referrer
Retorna la URL del llamador
Tipo-String

QueryString
Retorna la porción de la URL que está después del signo “?”; o sea los parámetros.
Tipo- String

RemoteAddress
Devuelve la dirección del cliente.
Tipo- String

      ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un valor distinto de cero.
Tipo- Integer      

ErrDescrption
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String

Métodos


            GetVariable(<Variable>)
Retorna en un String el valor con el que viene cargada la <Variable> en el post.
<Variable>-        String

GetHeader(<Header>)
Retorna un String con el valor del header <Header>.
<Header>-        String

ToString()
Retorna un String con todo el ‘cuerpo’ del request.

ToFile(<FileName>)
Graba en un archivo el contenido del stream.
<FileName>-        String

HttpResponse

Este objeto permite escribir el response http. Puede instanciarse solo en el contexto de un WebProc. 

PROPIEDADES


      ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un valor distinto de cero.
Tipo- Integer      

ErrDescrption
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String
  

Metodos

       AddHeader(<Name>,<Value>)
       Agrega un header con el valor dado.
      Ejemplo: AddHeader(“User-Agent”, “GeneXus”)
      <Name>-      String
      <Value>-      String

       AddString(<Value>)
       Agrega el contenido del string al buffer de datos a enviar.
      <Value>-      String

       AddFile(<Value>)
       Agrega el contenido del archivo al buffer de datos a enviar.
      <Value>-      String

Interacción con XML

Estos objetos permiten la interacción con los objetos XMLReader y XMLWriter. Para ello existen los siguientes métodos:

XMLReader.openRequest(HttpRequest)
Se utiliza en un WebProc para leer un xml que viene en el body del http request.

XMLReader.openResponse(HttpClient)
Se utiliza en cualquier objeto para leer como XML lo que devolvió un request.

XMLWriter.openRequest(HttpClient)
Se utiliza para enviar un XML en el body de un http request.

XMLWriter.openResponse(HttpResponse)
Se utiliza en un WebProc para escribir un xml que se retornara en el body del http response. 

Ejemplo 

Este ejemplo muestra como un objeto GeneXus llama a otro vía http, pasándole parámetros en un XML y recibiendo los mismos también en un XML.

El XML a enviar tiene la forma

<parameters>
          <a>valor</a>
<b>valor</b>
</parameters>

El XML que se devuelve es igual, con los valores de ‘A’ y ‘B’ modificados.


El programa ‘cliente’ sería:

&Client de tipo HttpClient
&Writer de tipo XMLWriter
&Reader de tipo XMLReader

          // Determino el host y el puerto a donde hacer el request
              &client.host = "localhost"
              &client.port = 88 

          // Agrego el XML al request
&writer.openRequest(&client)
&writer.WriteStartElement("parameters")
&writer.WriteElement("a", &A)
&writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()

          // Hago el POST al webproc
&client.execute("POST", "/servlet/awebproc")
   
          // Leo el XML que devuelve y lo cargo en las variables internas

&reader.openResponse(&client)
&reader.read()

&reader.read()
&a = val(&reader.value)

&reader.read()   
&b = val(&reader.value)

&reader.close()


El programa ‘servidor’ seria el siguiente WebProc:

&Request de tipo HttpRequest
&Response de tipo HttpResponse
&Writer de tipo XMLWriter
&Reader de tipo XMLReader

          // Leo los parámetros del XML
&reader.openRequest(&Request)
&reader.read()
&reader.read()
&a = val(&reader.value)
&reader.read()   
&b = val(&reader.value)
&reader.close()

// Le sumo uno a cada valor
&a = &a + 1
&b = &b + 1
       
// Grabo los parámetros en el response

&writer.openResponse(&Response)
&writer.WriteStartElement("parameters")
      &writer.WriteElement("a", &A)
      &writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()

Consideraciones para el generador Java

En el caso de que se ejecute el motor de servlet en Windows, la aplicación obtendrá automáticamente la configuración del proxy http y la lista de hosts para los que no se debe utilizar el proxy.

En caso de que se ejecute en otra plataforma, es necesario especificar el proxy como una ‘System Property’ desde la línea de comandos del intérprete, por ej:

java -Dhttp.proxyHost=your.proxy.com -Dhttp.proxyPort=XX <mainclass>



 (Consideraciones Generales)

La propiedad secure del tipo de datos HTTPClient en el generador C/SQL solo puede ser utilizada en clientes Microsoft.



No hay comentarios: