Estoy diseñando una API REST pragmática y estoy un poco atascado en la mejor forma de agregar entidades existentes a una colección. Mi modelo de dominio incluye un proyecto que tiene una colección de sitios. Esta es una relación estricta de muchos a muchos y no tengo necesidad de crear una entidad que modele explícitamente la relación (es decir, ProjectSite).
Mi API permitirá a los consumidores agregar un sitio existente a un proyecto. Donde estoy colgado es que los únicos datos que realmente necesito son ProjectId y SiteId. Mi idea inicial fue:
1. POST myapi/projects/{projectId}/sites/{siteId}
Pero también pensé en
2. POST myapi/projects/{projectId}/sites
con una entidad del sitio enviada como contenido JSON.
La opción 1 es simple y funciona, pero no se siente del todo bien, y tengo otras relaciones que no pueden seguir este patrón, por lo que agrega inconsistencia a mi API.
La opción 2 se siente mejor pero lleva a dos preocupaciones:
- ¿Debo crear un sitio o lanzar una excepción si se publica un nuevo sitio (SiteId = 0)?
- Debido a que solo necesito ProjectId y SiteId para crear la relación, el Sitio podría publicarse con datos incorrectos o faltantes para otras propiedades.
Una tercera opción es proporcionar un punto final simple únicamente para crear y eliminar la relación. Este punto final esperaría una carga útil JSON que contenga solo ProjectId y SiteId.
¿Qué piensas?
fuente
Respuestas:
POST es el verbo "agregar", y también el verbo "procesar". PUT es el verbo "crear / actualizar" (para identificadores conocidos), y casi parece la opción correcta aquí, porque se conoce el URI de destino completo.
projectId
ysiteId
ya existe, por lo que no necesita "PUBLICAR en una colección" para generar una nueva ID.El problema con PUT es que requiere que el cuerpo sea la representación del recurso que está PUTING. Pero la intención aquí es agregar al recurso de colección "proyecto / sitios", en lugar de actualizar el recurso del sitio.
¿Qué sucede si alguien pone una representación JSON completa de un sitio existente? ¿Debería actualizar la colección y actualizar el objeto? Podrías apoyar eso, pero parece que esa no es la intención. Como dijiste,
Por el contrario, trataría de PUBLICAR
siteId
en la colección y confiar en la naturaleza de "agregar" y "procesar" de POST:Como está modificando el recurso de colección de sitios y no el recurso del sitio , ese es el URI que desea. POST puede saber "agregar / procesar" y agregar el elemento con esa identificación a la colección de sitios del proyecto.
Eso todavía deja la puerta abierta para crear nuevos sitios para el proyecto al desarrollar el JSON y omitir la identificación. "No id" == "crear desde cero". Pero si el URI de la colección obtiene una identificación y nada más, está bastante claro lo que debe suceder.
Interesante pregunta. :)
fuente
POST
lugar dePUT
oPATCH
aquí es que no tiene toda laSite
entidad para poner en elsites
recurso. Solo tiene la identificación, que requiere procesamiento para agregarla a la colección.Usamos el
Patch
método para cosas como esta. Lo que desea hacer es modificar un proyecto existente para agregarle un sitio.Entonces algo como esto funcionaría
con la entidad del sitio (s) como JSON / JSONArray en el cuerpo de la solicitud.
De esa manera, puede usar la misma URL para modificar diferentes partes del proyecto si lo necesita: su código en la implementación debe ser lo suficientemente inteligente como para manejar esta modificación parcial del recurso.
fuente
{"sites": [], "other-stuff": {}}
, entonces puede ramificar su código para manejar todos esos "subjsons" muy fácilmente. Realmente depende de su problema específico, pero aún así recomendaría usar PATCH ya que está diseñado específicamente para este tipo de cosas.PATCH
esperaría que la entidad completa se pase como su valor aquí, en lugar de una identificación que apunta a alguna entidad?