cancel
Showing results for 
Search instead for 
Did you mean: 

Llamar a webscripts via REST desde un java backed webscript propio... es posible? Y una buena idea?

spilby
Confirmed Champ
Confirmed Champ
Buenas,

estoy haciendo un Java Backed Webscript para poner en Alfresco y llamarlo desde fuera via REST. Este Webscript realizará una serie de operaciones (encontrar un path, crear una carpeta y subir en ella un documento).

He estado leyendo sobre ello (no he hecho nada similar y estoy mirando cómo va el tema) y encontrado algunos ejemplos para realizar estas operaciones, utilizando la API nativa de Alfresco; es decir, métodos como getFileFolderService, getContentService, etc. de las clases Repository o ServiceRegistry. Todo lo hago en Java, nada de javascript.

Pero me planteo si es mejor utilizar llamadas REST a webscripts ya existentes para realizar estas operaciones, en lugar de usar la API nativa. Es decir, por qué pelearme con métodos para buscar nodos, hijos, hacer uploads, etc. si ya existen web scripts que lo hacen? Además que en el caso de futuras versiones de la API, si ésta cambia, es probable que las llamadas a los webscripts no lo hagan y sea más perdurable. Pero igual no es buena idea y no estoy en lo cierto. ¿Qué pensáis?

En resumen: para hacer esas 3 operaciones que antes indicaba, qué sería mejor y por qué? Usar la API nativa o hacer llamadas REST a webscripts ya existentes para buscar, crear carpetas, etc?

Y en caso de que decida realizar lo segundo… es posible hacerlo? Sería usar en mi webscript los métodos de HttpClient, getMethod/postMethod, etc, para hacer las llamadas REST. Podría darme problemas? Pensad que en definitiva lo que haría sería hacer una llamada REST a mi webscript desde fuera de Alfresco (via un servlet o como sea), el cual hace llamadas REST a otros webscripts.

Merci!
7 REPLIES 7

cybermakoki
Champ in-the-making
Champ in-the-making
Hola Spilby,

Yo solo he desarrollado nuevos webscripts cuando los que ya había no cumplían con los requisitos necesarios.

Hacer un webscript java backed te permite un mayor control de los errores y un poco más de margen a la hora de desarrollar, ya que lo estás haciendo en Java, y por supuesto tienes muchas más posibilidades.

Lo que no tiene mucho sentido, es que hagas un webscript que haga llamadas REST a otros webscripts, yo veo estas dos posibilidades:

1. Desarrollar un webscript Java backed que realice todas las acciones que necesitas, de esta forma, solo tendrás que hacer una llamada REST a un solo webscript.

2. Hacer X llamadas a los webscripts que ya existen en Alfresco para realizar las acciones necesarias.


Espero haberte servido de ayuda! si tienes cualquier duda me comentas Smiley Happy

un saludo,
Patricia.

Merci por la opinión, Patricia! Me estoy decantando por la primera opción que recomiendas. Serán varios webscripts propios, por eso, ya que otros reaprovecharan algunas de las acciones e irá bien que puedan llamarlos. Pero utilizaré la librería nativa de la API para las operaciones y las llamadas REST serán sólo para llamarse entre ellos.

Buscamos sobretodo rapidez, ya que habrá muchísimos registros en el repositorio, por lo que entiendo que usar la librería será además más eficiente que hacer X llamadas REST para cada acción, no?.

Ahora toca pelearse con la librería para saber como se crean nodos, se insertan propiedades, etc., a ver qué tal Smiley Surprised)


cybermakoki
Champ in-the-making
Champ in-the-making
Eso es Spilby, yo creo que es la mejor opción, sobretodo por el control que tienes sobre las acciones Smiley Happy

En esta wiki tienes ejemplos de las acciones más comunes que se hacen con el API, seguro que te sirve de ayuda:

https://wiki.alfresco.com/wiki/NodeRef_cookbook

Por otro lado,  creo que no puedes llamar a un webscript desde otro webscript, puedes mirar esto:

http://forums.alfresco.com/forum/developer-discussions/web-scripts/web-script-calling-another-web-sc...

Por supuesto, si usas librerias de http pues podrás hacerlo, pero insisto en que no se si tiene mucho sentido xD siempre depende de las acciones que vayas a realizar…

Suerte y nos vas contando!

Te cuento lo que tenía en mente, a ver cómo lo ves… Imagina dos acciones principales: guardar y descargar ficheros. Estas acciones harán a su vez una serie de acciones más pequeñas aparte del guardado y la descarga en sí. Creará rutas donde guardarlo, modificarán propiedades de cada nodo del path donde se guarde, y otras. De ahí el hacer un webscript para cada una de las acciones principales. Hasta aquí ok.

Ocurre que para poder reaprovechar esas 4 o 5 acciones pequeñas, la idea era que fueran también webscripts, para que puedan usarse en otros proyectos. De esta forma, si alguien necesita simplemente actualizar una serie de propiedades, llamaría por REST al webscript que lo hace.

Y los principales webscripts llamarían a los pequeños. ¿Cómo llamarlos? Pues la idea era también por REST. ¿No ves bien esta arquitectura? ¿Sería mejor montarlo de otra manera?

Merci de nuevo!


cybermakoki
Champ in-the-making
Champ in-the-making
Pues es que mira, no tienes un webscript sencillo para actualizar metadatos, tendrías que usar el servicio de formularios, que es el que usa alfresco, y no lo veo sencillo.

La verdad es que si tienes que hacer operaciones tan sencillas, creo que te cuesta menos hacerlas con API Java que haciendo tantas llamadas a otros webscripts, yo personalmente no lo veo, pero bueno, esto es una opinión. Y en cuanto a arquitectura, pues tampoco veo lo de llamar a un webscript que llama a otros webscripts…

Sip, eso haré, usar la API de Java. A lo mejor me he explicado mal en el anterior post, cuando hablaba de llamadas a webscripts me refería a webscripts hechos por mi con la API de Java, no a los ya existentes que ofrece Alfresco.

Intento explicarme mejor: imagina que tengo 10 operaciones realizadas con la API de Java. Todo eso lo englobo en un webscript propio que llamaremos A y que pongo en el alfresco, y que será llamado por REST por quien lo necesite. Hasta aquí supongo que no hago nada raro Smiley Surprised)

Y resulta que de esa lista de 10 operaciones, una secuencia de 3 de ellas, y otra de otras 4 de ellas, las usaran otras aplicaciones en otros proyectos. Pues meto esas 3 operaciones en un webscript B, y las otras 4 en otro webscript C.

Para no repetir código en varios sitios, mi webscript A hará sus cosas, entre ellas, llamar al B y al C.

<a>Webscript A:</a>

Operación 1

Operación 2

    Operación 3 – <a>Webscript B</a>

    Operación 4 – <a>Webscript B</a>

    Operación 5 – <a>Webscript B</a>

Operación 6

    Operación 7 – <a>Webscript C</a>

    Operación 8 – <a>Webscript C</a>

    Operación 9 – <a>Webscript C</a>

    Operación 10 – <a>Webscript C</a>

Habrá quien llame al B, quien llame al C, y quien llame al A (que incluye el B y el C)

Explicado de esta manera, ¿tiene más sentido hacerlo así?








spilby
Confirmed Champ
Confirmed Champ
Quería aprovechar para preguntar una duda más técnica. He querido hacer una prueba de llamada por HttpClient a un webscript desde el mio, y me ha devuelto ésto:

code: 404
name: Not found
description: Requested resource is not available.
message: The node could not be found
node: workspace://SpacesStore/015a7173-bcc1-4991-9100-d92883e1d056

Éste es mi código para la llamada:

<i>HttpClient client = new HttpClient();
          client.getParams().setAuthenticationPreemptive(true);
          client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("xxx", "yyy"));
GetMethod method = new GetMethod("http://111.222.333.444:8080/alfresco/service/api/node/workspace/SpacesStore/015a7173-bcc1-4991-9100-...");

method.setDoAuthentication(true);
method.setRequestHeader("Content-Type", "application/json");
int statusCode = client.executeMethod(method);</i>

¿Estoy haciendo algo mal?

El nodo existe porque si en el navegador pongo esa misma url que le paso al GetMethod me lo encuentra y me devuelve resultado, una vez me ha pedido las credenciales.

Merci!