Si una API RESTful puede devolver archivos, o solo una ubicación

12

Esto me ha estado desconcertando por un tiempo.

Por ejemplo, tenemos una API REST que proporciona contenido básico a un sistema, consumiendo y produciendo JSON. En este punto final, produce una URL a una imagen y una descripción, y se encuentra así: // localhost / myApi / pictures / 1

{
    id: 1,
    description: "This is a pretty picture of a daisy",
    URL: <OUR URL>
}

Ahora OUR_URL debería apuntar a una ubicación en la API, por ejemplo // localhost / myApi / files / pictures / 1 que devuelve un JPG (la aplicación detrás de la API lee el contenido físico del archivo y luego lo transmite de nuevo al cliente ) Obviamente, esto es diferente al resto de la API que está produciendo respuestas JSON y habrá una sobrecarga por la lectura y la transmisión del archivo real.

Alternativamente, OUR_URL debe apuntar a una URL fuera del alcance del servicio REST, entonces //localhost/files/pictures/1.jpg donde lee el archivo directamente.

Entonces la pregunta es:

¿Debería una API RESTful poder devolver archivos, o solo una ubicación?

Crazy Dino
fuente
1
Te das cuenta de que la descripción general de lo que es REST equivale a "los clientes hacen solicitudes a una URL y el servidor devuelve cosas", ¿verdad? La idea general es que REST está muy poco definido y puede adaptarse a casi cualquier esquema de recuperación basado en URL.

Respuestas:

17

Un servicio RESTful debería proporcionar recursos a los usuarios de la API. Los recursos pueden tener varios formatos, que van desde JSON o XML a JPEG y HTML.

Ni siquiera hay un requisito, ni siquiera una expectativa, de que una única API solo sirva recursos de un único formato. No hay nada de malo en servir un documento JSON en el URI /myApi/pictures/1y un archivo JPEG desde el URI /myApi/files/pictures/1.
En un caso más extremo, incluso es posible servir tanto la descripción JSON como el archivo JPEG desde la misma URL, dependiendo del formato que solicite el solicitante.

Bart van Ingen Schenau
fuente
7

Un problema que tendrá al devolver los URI es que un servidor de archivos antiguo no puede hacer seguridad. Entonces, si necesita hacer algún tipo de limitación sobre quién puede acceder a un archivo, entonces deberá poder devolverlo directamente en la API REST (o no, si el usuario no tiene derechos, el archivo es no en el estado correcto, etc.).

De lo contrario, devolver el viejo URI simple y dejar que vaya a un CDN dedicado tiene muchos beneficios en cuanto a aprovisionamiento, simplicidad y escalabilidad, suponiendo que eso sea todo lo que necesita hacer.

Telastyn
fuente
El aspecto de autenticación es un muy buen punto, algo que nunca había considerado.
Crazy Dino