viernes, octubre 16, 2015

Genexus Emisor y Consumidor servicios web Rest



Resulta un poco complicado por primera vez inciarse en la utilización de los servicios web rest con el genexus.

Para el caso citamos algunas recomendaciones y tener exito al momento de emprender el desarrollo de servicios web tipo rest.

Para el caso se utilizo la versión Genexus Evolution 3 Upgrade 4.

SERVICIO WEB REST EMISOR

1.- Crear un procedimiento, para el caso asignamos el siguiente nombre (swrestconsultacliente).
2.- Modificar las propiedades del Procedmiento, como nos indica la siguiente imagen:



3.-   La forma que hemos encontrado es utilizar solo parametros de Salida con datos complejos es decir utilizar SDT estructura de datos.
Se sugiere crear las siguiente variables.
// Crear una variable SDTParametros tipo SDT, debe concordar con la variable que utiliza el servicio web consumidor como parametro.
// SDTEnTexto variable tipo de LonvarChar.

Debemos crear en la RULES lo siguiente:
// Parametros de Salida.
Parm(Out:&SDTParametros);

4.- En el SOURCE debemos crear lo siguiente como parte basica, cuando se recibe parametros por parte del Servicio Web consumidor:
// Parametros de Entrada al Servicio web Rest consumidor.
&SDTEnTexto = &HttpRequest.ToString()
&SDTParametros.FromJson(&SDTEnTexto)


// Leer archivo de Clientes.
For Each 
       Order By ClienteCodigo   
       Where ClienteCodigo =  &SDTParametros.ClienteCodigo
        Defined By ClienteEstReg
                       &SDTParametros.ClienteNombre = ClienteNombre
EndFor 

Return

Si no existe envio de parametros de entrada para el servicio web consumidor simplemente se ignora las dos primeras lineas.


Con estas instrucciones queda listo el servicio web rest emisor.


SERVICIO WEB REST CONSUMIDOR.

1.- Para el caso vamos a crear un WEBPANEL, pero de la misma forma podriamos crear un Procedimiento o cualquier otro objeto que consume el servicio web rest.

2.- Creamos la siguiente variables:
// SDTParametros una variable tipo SDT que puede contener un campo o mas campos de cualquier tipo de dato.
// HttpClient basada en el tipo de dato HttpClient.
// HttpRequest basado en el tipo de dato HttpRequest.
// StatusCode tipo de dato Númerico con Logitud de 8 digitos.
// Resultado tipo de dato LongVarChar
// SDTEnTexto tipo de dato LongVarChar.
// Url tipo de dato URL

Event Enter
          &SDTParametros.ClienteCodigo = 59394884
          &SDTParametros.ClienteNombre = ''
          &SDTEnTexto = &SDTParametros.ToJson()
       
          &HttpClient.AddString(&SDTEnTexto)
          &HttpClient.Host         = &HttpRequest.ServerHost  //  Servidor donde esta el SW Rest                  

          &HttpClient.Port          = &HttpRequest.ServerPort   //   Puerto donde esta el SWRest
          &HttpClient.BaseUrl    = "/swrestemisor/rest/"          //   Carpeta del  SWRest
          &Url                              = "swresconsultacliente"  // Nombre del Procemiento EMISOR                                                                                                      // no debe incluir el nombre de los modulos.
          &HttpClient.Execute("POST", &Url)
          &StatusCode                 = &HttpClient.StatusCode
          &Resultado                   = &HttpClient.ToString()
          &SDTParametros.FromJson(&Resultado)

EndEvent

3.- Creamos en la RULES.
// Parametros de Salida.
Parm(Out:&SdtParametros);

Como resultado final tendremos la información del nombre de cliente en la variable &SDTParametros.ClienteNombre.

Cuando lo llevemos a produccion,  tenemos que modificar en la aplicacion del consumidor (webapps) el archivo web.xml, incluyendo los siguientes datos:

================

<servlet>
    <servlet-name>JerseyListener</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>**packagename.GXApplication</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
    </init-param>
</servlet>



<servlet-mapping>
    <servlet-name>JerseyListener</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>


================


**En caso de tener la propiedad java package name vacia escribir solamente GXApplication, en caso contrario escribir el nombre del package (desde XEV3 por defecto se incluye un package nameen las Knowledge base)

Tomado del articulo: Publicar Servicios web

Como elemento importante se puede utilizar las siguientes herramientas para realizar TESTING  de los servicios web:

1.- WizTool
2.- SOAP UI - 32 Bits
3.- FireFox RestClients
4.- Chrome Rest Client

No hay comentarios: