Sie sind auf Seite 1von 95

TESTING Y DOCUMENTACIÓN DE SERVICIOS

REST

@BORILLO

YO

{

 

name:'RicardoBorillo',

company:'UniversitatJaumeI',

mail:'borillo@uji.es',

social:{

twitter:'@borillo',

blog:'xml-utils.com',

linkedin:'linkedin.com/in/borillo'

}

}

YO

YO

ÍNDICE

ÍNDICE HTTP y REST Jersey JAX-RS Testing: Objetivos y alternativas Mejora de la expresividad Documentación de

HTTP y RESTÍNDICE Jersey JAX-RS Testing: Objetivos y alternativas Mejora de la expresividad Documentación de los servicios

Jersey JAX-RSÍNDICE HTTP y REST Testing: Objetivos y alternativas Mejora de la expresividad Documentación de los servicios

Testing: Objetivos y alternativasÍNDICE HTTP y REST Jersey JAX-RS Mejora de la expresividad Documentación de los servicios

Mejora de la expresividadÍNDICE HTTP y REST Jersey JAX-RS Testing: Objetivos y alternativas Documentación de los servicios

Documentación de los serviciosÍNDICE HTTP y REST Jersey JAX-RS Testing: Objetivos y alternativas Mejora de la expresividad

HTTP Y REST

CARACTERÍSTICAS DE REST:

USO DE LOS VERBOS HTTP

CARACTERÍSTICAS DE REST: USO DE LOS VERBOS HTTP

CARACTERÍSTICAS DE REST:

CUALQUIER FORMATO SOBRE HTTP

CARACTERÍSTICAS DE REST: CUALQUIER FORMATO SOBRE HTTP

CARACTERÍSTICAS DE REST:

ORIENTADO A RECURSOS

Lista todos los coches o recupera uno:

GET/cars

GET/cars/1234AAW

Añade, modifica o elimina un coche:

POST/cars

PUT/cars/1234AAW

DELETE/cars/1234AAW

LA GRAN VENTAJA DE REST

APROVECHA AL MÁXIMO LA INSFRASTRUCTURA DE HTTP

Simplicidad, escalabilidad, cacheo, seguridad,

REST != RPC

Evitar cosas como:

/getUsuario

/getAllAsuarios

/modificaCuentaById

Utilizar nombres que definen recursos:

/usuarios

/usuarios/1

/usuarios/1/facturas

JERSEY JAX-RS

¿QUÉ ES?

Jersey es la implementación Java de referencia del estándar JAX-RS para la definición de servicios REST:

https://jersey.dev.java.net/

Java de referencia del estándar JAX-RS para la definición de servicios REST: https://jersey.dev.java.net/
Java de referencia del estándar JAX-RS para la definición de servicios REST: https://jersey.dev.java.net/

CONFIGURACIÓN DE UNA APLICACIÓN WEB JERSEY

Usando Maven:

<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId>

<version>1.17.1</version>

</dependency>

<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId>

<version>1.17.1</version>

</dependecy>

¿QUÉ ES?

Mapear peticiones HTTP a código Java @GET / @POST / @PUT / @DELETE

@Path("users")

publicclassUsersResource

{

@GET

publicList<User>getUsers(){

}

}

@Path ( "users" ) publicclass UsersResource { @GET public List<User>getUsers(){ } } GET/users

GET/users

¿QUÉ ES?

Mapear parámetros de URL a parámetros de entrada a los métodos @PathParam / @QueryParam

@GET @Path("/users/{userId}") publicUsergetUser( @PathParam("userId")StringuserId,

@QueryParam("debug")@DefaultValue("5")Stringdebug)

{

}

GET/users/1421?debug=S

¿QUÉ ES?

Declaración del formato de los contenidos recibidos o emitidos @Consumes / @Produces

@GET

@Produces(MediaType.APPLICATION_XML)

publicList<User>getUsers(){

}

@PUT

@Consumes(MediaType.APPLICATION_JSON)

publicvoidupdateUser(Useruser){

}

MAPEO DE LA PETICIÓN HTTP:

MAPEO DE LA PETICIÓN HTTP:

MAPEO DE LA RESPUESTA HTTP:

MAPEO DE LA RESPUESTA HTTP:

OTRAS FUNCIONALIDADES DISPONIBLES:

HypermediaOTRAS FUNCIONALIDADES DISPONIBLES: Seguridad: OAuth, SSL, etc Logging Gestión de excepciones Soporte para Spring

Seguridad: OAuth, SSL, etcOTRAS FUNCIONALIDADES DISPONIBLES: Hypermedia Logging Gestión de excepciones Soporte para Spring Framework API de acceso

LoggingDISPONIBLES: Hypermedia Seguridad: OAuth, SSL, etc Gestión de excepciones Soporte para Spring Framework API de

Gestión de excepcionesDISPONIBLES: Hypermedia Seguridad: OAuth, SSL, etc Logging Soporte para Spring Framework API de acceso cliente Uploads:

Soporte para Spring FrameworkSeguridad: OAuth, SSL, etc Logging Gestión de excepciones API de acceso cliente Uploads: Jersey Multipart Testing:

API de acceso clienteGestión de excepciones Soporte para Spring Framework Uploads: Jersey Multipart Testing: Jersey Test Framework Y

Uploads: Jersey MultipartGestión de excepciones Soporte para Spring Framework API de acceso cliente Testing: Jersey Test Framework Y

Testing: Jersey Test FrameworkLogging Gestión de excepciones Soporte para Spring Framework API de acceso cliente Uploads: Jersey Multipart Y

Y mucho másexcepciones Soporte para Spring Framework API de acceso cliente Uploads: Jersey Multipart Testing: Jersey Test Framework

Servicios REST: Jersey JAX-RS https://vimeo.com/53338309
Servicios REST: Jersey JAX-RS https://vimeo.com/53338309

Servicios REST: Jersey JAX-RS

TESTING:

OBJETIVOS BÁSICOS

¿QUÉ NOS GUSTARÍA CONSEGUIR?

Expresividad y sencillez en las validaciones¿QUÉ NOS GUSTARÍA CONSEGUIR? Entorno integrado Arraque automático de los servicios desarrollados Ejecución

Entorno integradoCONSEGUIR? Expresividad y sencillez en las validaciones Arraque automático de los servicios desarrollados

Arraque automático de los servicios desarrolladosy sencillez en las validaciones Entorno integrado Ejecución automática de las pruebas Restitución del

Ejecución automática de las pruebasen las validaciones Entorno integrado Arraque automático de los servicios desarrollados Restitución del entorno

Restitución del entornovalidaciones Entorno integrado Arraque automático de los servicios desarrollados Ejecución automática de las pruebas

TESTING:

APROXIMACIÓN INICIAL

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

A través de un navegador web:

Consulta de páginasHTTP: ACCEDIENDO A CONTENIDOS EN LA WEB A través de un navegador web: Envío de formularios

Envío de formulariosHTTP: ACCEDIENDO A CONTENIDOS EN LA WEB A través de un navegador web: Consulta de páginas

Subir ficheros al servidorHTTP: ACCEDIENDO A CONTENIDOS EN LA WEB A través de un navegador web: Consulta de páginas

PLUGINS: PRUEBAS DESDE EL NAVEGADOR

PLUGINS: PRUEBAS DESDE EL NAVEGADOR REST client REST Console POSTman Advance REST client

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

Desde línea de comandos

curl-XGEThttp://www.google.es/

O extrayendo las peticiones de las Chrome Tools

EN LA WEB Desde línea de comandos curl-XGEThttp://www.google.es/ O extrayendo las peticiones de las Chrome Tools

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

REST SHELL

Consola sencilla de utilizar y con completadoHTTP: ACCEDIENDO A CONTENIDOS EN LA WEB REST SHELL Compatible con HATEOAS (soporta discover) Fácil interacción

Compatible con HATEOAS (soporta discover)WEB REST SHELL Consola sencilla de utilizar y con completado Fácil interacción con servicios REST Carga

Fácil interacción con servicios RESTy con completado Compatible con HATEOAS (soporta discover) Carga y guardado de peticiones y respuestas Configuración

Carga y guardado de peticiones y respuestas(soporta discover) Fácil interacción con servicios REST Configuración del contexto: Cabeceras, auth, etc D i s

Configuración del contexto: Cabeceras, auth, etcservicios REST Carga y guardado de peticiones y respuestas D i s p o n i

Disponible en: GitHub REST-shell

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

Definición del recurso a utilizar:

http://localhost:8080:>baseUrihttp://xxxxxxx

BaseURIsetto'http://xxxxxxx'

Acceso a recursos:

>getresource--params"{param1:'value'}"

>postresource--data"{param1:'value'}"

>post--fromdata.json

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

HATEOAS: discover:

>discover

rel

href

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

people

http://localhost:8080/person

>followpeople

http://localhost:8080/person:>list

rel

href

=================================================== people.Person http://localhost:8080/person/1

people.search http://localhost:8080/person/search

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

HATEOAS: get

http://localhost:8080/person:>get1

>GEThttp://localhost:8080/person/1

<200OK

<ETag:"2"

<Content-Type:application/json

<

{

"links":[{ "rel":"self",

"href":"http://localhost:8080/person/1"

}],

"name":"JohnDoe"

}

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB

Desde algún lenguaje de programación como Java

DefaultHttpClientclient=newDefaultHttpClient();

client.execute(newHttpGet("http://www.uji.es/"));

O con el API cliente de Jersey JAX-RS:

Clientclient=Client.create();

WebResourceresource=client.resource("http://www.uji.es/");

ClientResponseresponse=resource.accept("text/html").

get(ClientResponse.class);

if(response.getStatus()==200){

System.out.println(response.getEntity(String.class));

}

TESTING:

HERRAMIENTAS DE AUTOMATIZACIÓN

SOAPUI

CREACIÓN DEL PROYECTO

SOAPUI CREACIÓN DEL PROYECTO

SOAPUI

EJECUCIÓN DEL SERVICIO

SOAPUI EJECUCIÓN DEL SERVICIO

SOAPUI

CREACIÓN DEL TESTCASE

SOAPUI CREACIÓN DEL TESTCASE

SOAPUI

EJECUCIÓN DEL TEST

SOAPUI EJECUCIÓN DEL TEST

SOAPUI

AÑADIR UNA ASERCIÓN

SOAPUI AÑADIR UNA ASERCIÓN

SOAPUI

VALOR EXPECTED DE LA ASERCIÓN

SOAPUI VALOR EXPECTED DE LA ASERCIÓN

SOAPUI

INFORME DE EJECUCIÓN DE LA SUITE

SOAPUI INFORME DE EJECUCIÓN DE LA SUITE

SOAPUI

INFORME DE EJECUCIÓN DE LA SUITE

SOAPUI INFORME DE EJECUCIÓN DE LA SUITE

TESTING:

JERSEY TEST FRAMEWORK

DEPENDENCIAS EXTRA NECESARIAS

Añadir al pom.xml las siguientes dependencias:

<dependency> <groupId>com.sun.jersey.jersey-test-framework</groupId> <artifactId>jersey-test-framework-core</artifactId>

<version>1.17.1</version>

</dependency>

<dependency> <groupId>com.sun.jersey.jersey-test-framework</groupId> <artifactId>jersey-test-framework-grizzly</artifactId>

<version>1.17.1</version>

</dependency>

DEFINICIÓN DE UN TEST

Código necesario para arrancar el contenedor Java:

publicclassUsersResourceTestextendsJerseyTest{

privateWebResourceresource;

publicUsersResourceTest(){

super(newWebAppDescriptor.Builder("com.decharlas.services")

.contextParam("webAppRootKey","jersey-maven.root")

.servletClass(ServletContainer.class).build());

this.resource=resource();

}

@Override

protectedTestContainerFactorygetTestContainerFactory(){

returnnewGrizzlyWebTestContainerFactory();

}

}

DEFINICIÓN DE UN TEST

Definición de los tests:

publicclassUsersResourceTestextendsJerseyTest{

//Métodosdedefinicióndelaslideanterior

@Test publicvoiddeleteUser()throwsException{

ClientResponseresponse=resource.path("users/1")

.accept("application/json")

.delete(ClientResponse.class);

Assert.assertEquals(Status.NO_CONTENT.getStatusCode(),

}

}

response.getStatus());

MEJORANDO LA EXPRESIVIDAD DE NUESTROS TESTS

OBJETIVOS

Las aserciones en jUnit no resultan nada semánticas:

Assert.assertEquals(Status.NO_CONTENT.getStatusCode(),

response.getStatus());

Vamos a ver como mejorarlas y así conseguir:

Aserciones más fáciles de leerVamos a ver como mejorarlas y así conseguir: Menos duplicación de código en las pruebas Mejora

Menos duplicación de código en las pruebasy así conseguir: Aserciones más fáciles de leer Mejora de la semántica Facilidad de comprobación de

Mejora de la semánticaAserciones más fáciles de leer Menos duplicación de código en las pruebas Facilidad de comprobación de

Facilidad de comprobación de los resultadosy así conseguir: Aserciones más fáciles de leer Menos duplicación de código en las pruebas Mejora

MEJORANDO LA EXPRESIVIDAD DE NUESTROS TESTS:

HAMCREST

MEJORAR LOS TESTS CON HAMCREST

Matchers para asserts sobre nuestros servicios

publicclassOkResponseMatcherextendsTypeSafeMatcher<ClientResponse>{ @Override publicbooleanmatchesSafely(ClientResponseresponse){

return(response!=null&&response.getStatus()==200);

}

publicvoiddescribeTo(Descriptiondescription){

description.appendText("notaHTTP200response");

}

@Factory

publicstatic<T>Matcher<ClientResponse>ok(){

returnnewOkResponseMatcher();

}

}

MEJORAR LOS TESTS CON HAMCREST

Uso del anterior matcher "OkResponseMatcher"

@Test publicvoidtest(){ ClientResponseresponse=

resource.path("users/1").get(ClientResponse.class);

assertThat(response,is(ok()));

}

MEJORANDO LA EXPRESIVIDAD DE NUESTROS TESTS:

REST-ASSURED

DEFINICIÓN

DEFINICIÓN Testing and validating REST services in Java is harder than in dynamic languages such as

Testing and validating REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into the Java domain.

DEPENDENCIAS EXTRA NECESARIAS

Añadir al pom.xml las siguientes dependencias:

<dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId>

<version>1.8.0</version>

<scope>test<scope>

</dependency>

CARACTERÍSTICAS PRINCIPALES:

Integración HTTP total: Cookies, auth, headers,CARACTERÍSTICAS PRINCIPALES: Expresivo DSL para realizar las comprobaciones JsonPath y XmlPath para validar información

Expresivo DSL para realizar las comprobacionesIntegración HTTP total: Cookies, auth, headers, JsonPath y XmlPath para validar información Matchers

JsonPath y XmlPath para validar informaciónheaders, Expresivo DSL para realizar las comprobaciones Matchers Hamcrest para las validaciones Custom parsers por

Matchers Hamcrest para las validacionescomprobaciones JsonPath y XmlPath para validar información Custom parsers por content type Dispone de un StubServer

Custom parsers por content typevalidar información Matchers Hamcrest para las validaciones Dispone de un StubServer Logging M u c h

Dispone de un StubServerpara las validaciones Custom parsers por content type Logging M u c h o m á

LoggingCustom parsers por content type Dispone de un StubServer M u c h o m á

TEST: EL USERID DEBE SER 5

{ "User":{ "userId":5, "friends":[{ "userId":23, "refs":[2,45,34,23,3,5] },{
{
"User":{
"userId":5,
"friends":[{
"userId":23,
"refs":[2,45,34,23,3,5]
},{
"userId":54,
"refs":[52,3,12,11,18,22]
}]
}
}

given().expect().body("User.userId",equalTo(5)).

when().get("/users");

TEST: 23 Y 54 DEBEN ESTAR ENTRE LOS AMIGOS

{ "User":{ "userId":5, "friends":[{ "userId":23, "refs":[2,45,34,23,3,5] },{
{
"User":{
"userId":5,
"friends":[{
"userId":23,
"refs":[2,45,34,23,3,5]
},{
"userId":54,
"refs":[52,3,12,11,18,22]
}]
}
}

expect().body("User.friends.userId",hasItems(23,54)).

when().get("/users");;

TEST: EL SALUDO DEBE SER PARA RICARDO

<greeting>

<firstName>Ricardo</firstName>

<lastName>Borillo</lastName>

</greeting>

expect().body(hasXPath("//firstName",

containsString("Ricardo"))).

when().post("/greets");

expect().body(hasXPath("//firstName[text()='Ricardo']")).

when().post("/greets");

INTEGRACIÓN CON JERSEY

Jersey Test Framework: Arranque servicios REST con GrizzlyINTEGRACIÓN CON JERSEY Configuramos REST-assured para conectar a estos servicios RestAssured.baseURI=

Configuramos REST-assured para conectar a estos serviciosJersey Test Framework: Arranque servicios REST con Grizzly RestAssured.baseURI= "http://localhost" ;

RestAssured.baseURI="http://localhost";

RestAssured.port=this.resource.getURI().getPort();

RestAssured.basePath="/appbasepath";

RestAssured.authentication=basic("username","password");

DOCUMENTACIÓN DE SERVICIOS REST:

SWAGGER

¿QUÉ ES SWAGGER?

Swagger is a specification and complete framework implementation for describing, producing, consuming, and visualizing RESTful web services.

The overarching goal of Swagger is to enable client and documentation systems to update at the same pace as the server. With Swagger, deploying managing, and using powerful APIs has never been easier.

SWAGGER-UI: EL INTERFAZ DE SWAGGER

Conjunto de ficheros HTML/CSS/JavaScript sin ninguna dependencia adicionalSWAGGER-UI: EL INTERFAZ DE SWAGGER Documentación atractiva y dinámica Permite la interacción con los servicios REST

Documentación atractiva y dinámicaHTML/CSS/JavaScript sin ninguna dependencia adicional Permite la interacción con los servicios REST Sólo es

Permite la interacción con los servicios RESTdependencia adicional Documentación atractiva y dinámica Sólo es necesario que nuestros servicios REST sean

Sólo es necesario que nuestros servicios REST sean "swagger-compliant"sin ninguna dependencia adicional Documentación atractiva y dinámica Permite la interacción con los servicios REST

SWAGGER-UI: APIS REST "SWAGGER COMPLIANT"

Los servicios REST deben exportar su descripción

{

 

apiVersion:"0.2",

swaggerVersion:"1.1",

basePath:"http://petstore.swagger.wordnik.com/api",

apis:[

{

path:"/pet.{format}",

description:"Operationsaboutpets"

},

{

path:"/user.{format}",

description:"Operationsaboutuser"

}

]

}

SWAGGER-UI: POSIBILIDADES DE INTEGRACIÓN

Disponibles integraciones para múltiples lenguajes y frameworks:

Java/Scala JAX-RSINTEGRACIÓN Disponibles integraciones para múltiples lenguajes y frameworks: NodeJS Grails S y mfon y 2 Muchos

NodeJSDisponibles integraciones para múltiples lenguajes y frameworks: Java/Scala JAX-RS Grails S y mfon y 2 Muchos

GrailsDisponibles integraciones para múltiples lenguajes y frameworks: Java/Scala JAX-RS NodeJS S y mfon y 2 Muchos

Sy mfon y 2 ymfony 2

SWAGGER-UI: GENERACIÓN DEL CLIENTE HTML

Descargamos el código del proyecto:SWAGGER-UI: GENERACIÓN DEL CLIENTE HTML gitclonehttps://github.com/wordnik/swagger-ui.git Inicializamos dependencias y

gitclonehttps://github.com/wordnik/swagger-ui.git

Inicializamos dependencias y construimos:proyecto: gitclonehttps://github.com/wordnik/swagger-ui.git npminstall npmrun-scriptbuild En el directorio dist

npminstall

npmrun-scriptbuild

En el directorio dist tenemos el UI listo para copiar a donde queramos disttenemos el UI listo para copiar a donde queramos

SWAGGER:

INTEGRACIÓN CON JERSEY JAX-RS

DEPENDENCIAS EXTRA NECESARIAS

Añadir al pom.xml las siguientes dependencias:

<dependency> <groupId>com.wordnik</groupId>

<artifactId>swagger-jaxrs_2.9.1</artifactId>

<version>1.2.1</version>

</dependency>

CARGA DEL PROVIDER DE SWAGGER EN JERSEY

Modificar la definición de Jersey en el web.xml:

<servlet>

<servlet-name>jersey</servlet-name>

<servlet-class>

com.sun.jersey.spi.container.servlet.ServletContainer

</servlet-class>

<init-param>

<param-name>

com.sun.jersey.config.property.packages

</param-name>

<param-value>

com.your.project;com.wordnik.swagger.jaxrs.listing

</param-value>

</init-param>

</servlet>

PARÁMETROS BÁSICOS DE SWAGGER

Modificar la definición de Jersey en el web.xml:

<servlet>

<init-param> <param-name>swagger.api.basepath</param-name>

<param-value>http://localhost:8080</param-value>

</init-param> <init-param> <param-name>api.version</param-name>

<param-value>1.0</param-value>

</init-param>

</servlet>

ANOTACIONES EN LOS SERVICIOS REST

Anotaciones Swagger en nuestro servicios Jersey:

@GET

 

@Path("/{petId}")

@ApiOperation(value="Findpet",notes="Extranotes",responseClass="com.model.Pet")

@ApiErrors(value={@ApiError(code=400,reason="InvalidIDsupplied"),

@ApiError(code=404,reason="Petnotfound")})

publicResponsegetPetById(

@ApiParam(value="PetID",required=true)@PathParam("petId")StringpetId)

throwsNotFoundException{

//

yourresourcelogic

@Path("/pet.json")

@Api(value="/pet",description="Operationsaboutpets")

@Produces({"application/json"})

publicclassPetResource{

}

}

DOCUMENTACIÓN GENERADA

Accedemos al índice de servicios documentados:

curl-XGEThttp://localhost:8080/api-docs.json

{

 

apiVersion:"1.0",

swaggerVersion:"1.0",

basePath:"http://localhost:8080",

apis:[

{

path:"/api-docs.{format}/pet",

description:"Operationsaboutpets"

}

]

}

DOCUMENTACIÓN GENERADA

Y luego a la descripción de un servicio:

curl-XGEThttp://localhost:8080/api-docs.json/pet

{

apiVersion:"1.0",

swaggerVersion:"1.0",

basePath:"http://localhost:8080",

resourcePath:"/pet",

apis:[

{

path:"/pet.{format}/{petId}",

description:"Operationsaboutpets",

operations:[{

parameters:[

{

name:"petId",

SWAGGER:

INTEGRACIÓN CON NODEJS & EXPRESS

CONFIGURACIÓN DE SWAGGER-UI

Copiamos swagger-ui al proyecto y lo inicializamos:

vardocs_handler=express.static( dirname+'/swagger-ui/');

app.get(/^\/docs(\/.*)?$/,function(req,res,next){ if(req.url==='/docs'){

res.writeHead(302,{'Location':req.url+'/'});

res.end();

return;

}

req.url=req.url.substr('/docs'.length);

returndocs_handler(req,res,next);

});

DESCRIPCIÓN DE LOS MODELOS DE LA APLICACIÓN

Fichero models.js:

exports.models={ "User":{ "id":"User", "properties":{ "id":{
exports.models={
"User":{
"id":"User",
"properties":{
"id":{
"type":"long"
},
"name":{
"type":"string"
}
}
}
};

DESCRIPCIÓN DE LOS RECURSOS REST

exports.getUserById={

'spec':{

"description":"users",

"path":"/users.{format}/{userId}",

"notes":"ReturnsanuserbasedonID",

"summary":"FinduserbyID",

"method":"GET",

"params":[param.path("userId","IDofthefetcheduser","string")],

"responseClass":"User",

"errorResponses":[swaggerErrors.invalid('id'),

swaggerErrors.notFound('user')],

"nickname":"getUserById"

},

'action':function(req,res){

//procesamiento

};

}

CONFIGURAMOS LOS PARÁMETROS DE SWAGGER

Modelos, recursos, punto de acceso y versión:

varswagger=require("./swagger.js"),

resources=require("./resources.js"),

models=require("./models.js");

varapp=express();

app.use(express.bodyParser());

swagger.setAppHandler(app); swagger.addModels(models).addGet(resources.getUserById);

swagger.configure("http://localhost:8002","0.1");

¿PREGUNTAS?

¿PREGUNTAS?