2010-06-10 19 views
6

Estoy tratando de diseñar un servicio similar al del sistema de archivos REST, y las operaciones de copiar/mover me están causando algunos problemas.operaciones RESTful copy/move?

En primer lugar, la posibilidad de subir un nuevo archivo se realiza utilizando un PUT para URL final del archivo:

PUT /folders/42/contents/<name> 

La pregunta es, ¿y si el nuevo archivo ya reside en el sistema bajo un URL diferente?

Copiar/mover idea 1: PUT con encabezados personalizados.

Esto es similar a S3's copy. Una opción de venta que se ve igual que la carga, pero con un encabezado personalizado:

PUT /folders/42/contents/<name> 
X-custom-source: /files/5 

Esto es bueno porque es fácil de cambiar el nombre del archivo en copiar/mover tiempo. Sin embargo, S3 no ofrece una operación de movimiento, tal vez porque un movimiento con este esquema no será idempotente.

Copiar/mover Idea 2: POST a carpeta principal.

Esto es similar al Google Docs copy. Un POST a la carpeta de destino con contenido XML que describe el archivo de origen:

POST /folders/42/contents 
... 
<source>/files/5</source> 
<newName>foo</newName> 

que podría ser capaz de publicar en la nueva dirección URL del archivo para cambiar su nombre ..? De lo contrario, me veo obligado a especificar un nuevo nombre en el contenido XML, lo que amplifica el RPCness de esta idea. Tampoco es tan consistente con la operación de carga como idea 1.

Al final estoy buscando algo que sea fácil de usar y comprender, ¡además de criticar lo anterior, sin duda nuevas ideas son bienvenidas!

Respuesta

4

La especificación HTTP dice si el recurso ya existe, entonces la actualización del recurso y volver 200. Si el recurso no existe, entonces se crea y se regresa 201.

Editar:
Ok, leer mal. Prefiero el enfoque de POST a la carpeta principal. También podría consultar el archivo fuente utilizando un parámetro de cadena de consulta. p.ej.

POST /destination/folder?sourceFile=/source/folder/filename.txt 
+0

Lo siento, quise decir que si el nuevo archivo ya reside en el sistema en una URL diferente. Es decir, no quiero volver a subir el archivo. Solo quiero que se reubique. – ladenedge

+0

Fuimos con una POST al contenedor primario. Parecía ser el método más fácil de entender por los recién llegados. Gracias por las ideas! – ladenedge

+0

Debe enviar los parámetros de URL en el cuerpo del POST – Tarion

0

Para la parte de movimiento, acaba de hacer un combo de Copia (PUT) y luego en Eliminar si desea que sea sencillo.

+0

Es una buena idea, pero parece que copiar y mover funciona básicamente de la misma manera aquí; No estoy seguro de que deconstruir movimiento me compre mucho. :-( – ladenedge

4

REST no está limitado al conjunto predeterminado de métodos HTTP. Podría usar WebDAV en este caso.

+0

¡Es una idea interesante! Tendré que investigar esto. – ladenedge

6

Para crear un nuevo recurso, generalmente usa POST. Esto debería crear un nuevo recurso en un URI creado por el Servidor.

POST /folders/42/contents/fileName 
<target>newFile</target> 

Qué dice resto es que, con el nuevo recurso POST se encuentra en un camino determinado por el servidor. Así es como funciona la copia incluso en el FileSystem (Windows). Considera copia un archivo a un nombre que ya existe, entonces la respuesta del ejemplo anterior podría ser:

<newFileLocation>/folders/42/contents/newFile-2</newFileLocation> 

Un movimiento a continuación, se realiza por primera copia a continuación, elimine.No deberías hacer estas dos acciones en una sola solicitud.

Editar:
me encontré con el libro RESTful Web Services Cookbook muy bueno.

Capítulo 11 maneja el método de copia y recomienda lo siguiente en 11.1:

Problema ¿Quiere saber cómo hacer una copia de un recurso existente.

Solución Diseñe un recurso de controlador que pueda crear una copia. El cliente realiza una solicitud POST a este controlador para copiar el recurso . Para hacer que el POST sea condicional, proporcione un URI de única vez al cliente . Después de que el controlador crea la copia, devuelva el código de respuesta 201 (Creado) con un encabezado de Ubicación que contiene el URI de la copia.

Solicitud de POST/álbumes/2009/08/1011/duplicar; t = a5d0e32ddff373df1b3351e53fc6ffb1

Respuesta

<album xmlns:atom="http://www.w3.org/2005/Atom"> 
<id>urn:example:album:1014</id> 
<atom:link rel="self" href="http://www.example.org/albums/2009/08/1014"/> 
... 
</album> 
0

Para moverse, usted podría

a). copie a través de PUT con un encabezado de fuente personalizado seguido de un DELETE en la fuente.

b). BORRAR fuente con un encabezado de movimiento personalizado.

Prefiero esto último porque puede ser atómico y es claro para el cliente que el recurso se eliminó de la colección original. Y cuando OBTENGA la colección de su nueva ubicación, encontrará el recurso movido allí.