Al diseñar una interfaz REST, la semántica de los tipos de solicitud se considera vital para el diseño.
- GET : enumera la colección o recupera el elemento
- PUT - Reemplazar colección o elemento
- POST : crea una colección o elemento
- ELIMINAR : bueno, erm, eliminar colección o elemento
Sin embargo, esto no parece cubrir el concepto de "búsqueda".
Por ejemplo, al diseñar un conjunto de servicios web que admiten un sitio de búsqueda de empleo, es posible que tenga los siguientes requisitos:
- obtener anuncio de trabajo individual
-
GET a
domain/Job/{id}/
-
GET a
- Crear anuncio de trabajo
-
POST a
domain/Job/
-
POST a
- Actualizar anuncio de trabajo
-
PONER a
domain/Job/
-
PONER a
- Eliminar anuncio de trabajo
-
ELIMINAR a
domain/Job/
-
ELIMINAR a
"Obtener todos los trabajos" también es simple:
-
GET a
domain/Jobs/
Sin embargo, ¿cómo encaja la búsqueda de trabajo en esta estructura?
Usted podría afirmar que es una variación de "colección de listas" e implementarlo como:
-
GET a
domain/Jobs/
Sin embargo, las búsquedas pueden ser complejas y es completamente posible generar una búsqueda que genere una cadena GET larga. Es decir, haciendo referencia a una pregunta de SO aquí , hay problemas con el uso de cadenas GET de más de 2000 caracteres.
Un ejemplo podría estar en una búsqueda facetada, continuando con el ejemplo de "trabajo".
Puedo permitir la búsqueda de facetas: "Tecnología", "Título del trabajo", "Disciplina", así como palabras clave de texto libre, edad del trabajo, ubicación y salario.
Con una interfaz de usuario fluida y una gran cantidad de tecnologías y títulos de trabajo, es posible que una búsqueda abarque una gran cantidad de opciones de facetas.
Ajuste este ejemplo en CVs, en lugar de trabajos, traiga aún más facetas, y puede fácilmente imaginar una búsqueda con cientos de facetas seleccionadas, o incluso 40 facetas cada una de 50 caracteres (por ejemplo, títulos de trabajo, Nombres de universidades, nombres de empleadores).
En esa situación, podría ser conveniente mover un PUT o POST para garantizar que los datos de búsqueda se enviarán correctamente. Por ejemplo:
-
POST a
domain/Jobs/
Pero semánticamente es una instrucción para crear una colección.
Usted podría también dice que expresará esto como la creación de una búsqueda:
-
POST a
domain/Jobs/Search/
o (según lo sugerido por burninggramma a continuación)
-
POST a
domain/JobSearch/
Semánticamente puede parecer que tiene sentido, pero en realidad no estás creando nada, estás solicitando datos.
Por lo tanto, semánticamente es un GET , pero GET no garantiza que sea compatible con lo que necesitas.
Entonces, la pregunta es: intentar mantener lo más fiel al diseño RESTful posible, y al mismo tiempo garantizar que me mantengo dentro de las limitaciones de HTTP, ¿cuál es el diseño más apropiado para una búsqueda?