Estamos trabajando en migrar tres proyectos propios desarrollados con toba. Pasamos de la versión 2.7 a la 3.3 y pudimos migrar toda la información correctamente. Pero al probar la funcionalidad del sistema, notamos que los Servicios Rest que se ofrecen no devuelven nada. Es decir, si desde el Proyecto A consumimos un servicio esto funciona, pero si queremos consultar un servicio del Proyecto A la respuesta es nula.
Ingresando al Swagger del proyecto devuelve el siguiente mensaje:
Unable to render this definition
The provided definition does not specify a valid version field.
Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: “2.0” and those that match openapi: 3.0.n (for example, openapi: 3.0.0).
Pero no encontré donde debo indicar la “versión” y no se si esto será un tema de la visualización únicamente o si será todo lo mismo.
notamos que los Servicios Rest que se ofrecen no devuelven nada. Es decir, si desde el Proyecto A consumimos un servicio esto funciona, pero si queremos consultar un servicio del Proyecto A la respuesta es nula.
Como es que estan intentando acceder al servicio?.. via curl o Swagger? y porque decis que la respuesta es nula?
Ingresando al Swagger del proyecto devuelve el siguiente mensaje:
Unable to render this definition
.
.
Normalmente, eso significa que el json que se arma con la definicion esta roto, puede ser algo tan simple como un notice que esta saliendo en el medio del mismo.
Para chequearlo (y ver que se rompe) podes hacer lo siguiente via linea de comandos:
Luego te va a pedir el proyecto en cuestion y con eso se genera la misma definicion que veria Swagger, al menos podes ver si es un problema con la documentacion de los metodos de los WS… o alguna otra cuestion.
Los logs de Toba no devuelven ningún error
Revisaron los logs de Apache?.. si es un fatal quizas no alcance a grabarse en el log de Toba.
Otro lugar para mirar (si aun no lo chusmearon) seria en instalacion/i__[blahblah]/p__[tutu]/logs/web_services.log en el proyecto que sirve la API.
Una cuestion extra, la version de Swagger que estan utilizando es la que viaja contenida en el framework?
Como es que estan intentando acceder al servicio?.. via curl o Swagger? y porque decis que la respuesta es nula?
Dentro del sistema me conecto a través de CURL, aparentemente la conexión se establece correctamente y se ejecuta el servicio pero la respuesta llega sin datos, a eso me refería con nula. La conexión con la BDD esta OK en otras funciones del sistema, y las consultas del recurso REST las verifique (aunque no hayan sufrido modificaciones) y ahí si tengo info. Desde Swagger cuando quiero acceder es que tira el otro error de “unable to render this definition”.
Normalmente, eso significa que el json que se arma con la definicion esta roto, puede ser algo tan simple como un notice que esta saliendo en el medio del mismo.
Para chequearlo (y ver que se rompe) podes hacer lo siguiente via linea de comandos:
Luego te va a pedir el proyecto en cuestion y con eso se genera la misma definicion que veria Swagger, al menos podes ver si es un problema con la documentacion de los metodos de los WS… o alguna otra cuestion.
Al ejecutar el comando que me pasaste efectivamente habia algunos warning de PHP que corregí. Pero incluso cuando la respuesta del comando esta OK, sigo teniendo el mismo problema (tanto en el swagger como en el curl dentro del sistema)
Revisaron los logs de Apache?... si es un fatal quizas no alcance a grabarse en el log de Toba.
Si, pero no lanza ningún error.
Otro lugar para mirar (si aun no lo chusmearon) seria en [b]instalacion/i__[blahblah]/p__[tutu]/logs/web_services.log[/b] en el proyecto que sirve la API.
No tengo este archivo que me indicas, se activa de alguna forma?
Una cuestion extra, la version de Swagger que estan utilizando es la que viaja contenida en el framework?
Si, no modificamos nada. Es la que se instala con el composer.
Una cuestion a revisar seria si estan usando el “hidratador” en el armado de la respuesta del servicio, quizas no se este reconociendo el modelo y por ello la respuesta sea nula, podrian chequear tirando un var_dump() de los datos que deberian devolverse previo a eso?.. como para ver si el problema radica alli.
Al ejecutar el comando que me pasaste efectivamente habia algunos warning de PHP que corregí. Pero incluso cuando la respuesta del comando esta OK, sigo teniendo el mismo problema (tanto en el swagger como en el curl dentro del sistema)
Pero en Swagger podes ver la definicion al menos?
Si, pero no lanza ningún error.
Ok, entonces no seria un fatal en ppio.
No tengo este archivo que me indicas, se activa de alguna forma?
En gral se utiliza la misma definicion de error del proyecto, con lo cual si el mismo no loguea a archivos… la parte REST tampoco lo hara, sino puede ser simplemente una cuestion de seleccionar un nivel mas alto de forma que aparezcan los mensajes de DEBUG.
Si, no modificamos nada. Es la que se instala con el composer.
Genial, Swagger deberia parsear correctamente el json entonces
Una cuestion a revisar seria si estan usando el "hidratador" en el armado de la respuesta del servicio, quizas no se este reconociendo el modelo y por ello la respuesta sea nula, podrian chequear tirando un var_dump() de los datos que deberian devolverse previo a eso?... como para ver si el problema radica alli.
Lo revisé y si, con el var_dump() veo los datos correctamente.
Pero en Swagger podes ver la definicion al menos?
No, en el swagger no puedo ver la definición incluso tras corregir los warnings que mencionaba.
Cuando llamo al Rest desde la aplicación el log de toba no devuelve nada extraño, pero al intentar entrar a la definicion del swagger del proyecto noté que el log de toba si devolvia un error. Al rastrearlo por el código vi que el toba error se lanza en /framework/php/nucreo/lib/toba_rest.php
if (isset($datos_ini_proyecto['proyecto']['api_major']) && isset($datos_ini_proyecto['proyecto']['api_minor'])) {
$settings['api_version'] = "v{$datos_ini_proyecto['proyecto']['api_major']}.{$datos_ini_proyecto['proyecto']['api_minor']}";
$settings['api_major'] = $datos_ini_proyecto['proyecto']['api_major'];
$settings['api_minor'] = $datos_ini_proyecto['proyecto']['api_minor'];
} else {
throw new toba_error('No esta especificada la version de la API (major:minor)');
}