Estamos lanzando una nueva API REST y quería información de la comunidad sobre las mejores prácticas sobre cómo deberíamos formatear los parámetros de entrada:
En este momento, nuestra API está muy centrada en JSON (solo devuelve JSON). El debate sobre si queremos / necesitamos devolver XML es un tema aparte.
Como nuestra salida API está centrada en JSON, hemos estado siguiendo un camino en el que nuestras entradas están un poco centradas en JSON y he estado pensando que puede ser conveniente para algunos pero extraño en general.
Por ejemplo, para obtener algunos detalles del producto donde se pueden extraer varios productos a la vez, actualmente tenemos:
http://our.api.com/Product?id=["101404","7267261"]
¿Deberíamos simplificar esto como:
http://our.api.com/Product?id=101404,7267261
¿O es útil tener la entrada JSON? Más de un dolor?
Es posible que queramos aceptar ambos estilos, pero ¿esa flexibilidad realmente causa más confusión y dolores de cabeza (mantenibilidad, documentación, etc.)?
Un caso más complejo es cuando queremos ofrecer entradas más complejas. Por ejemplo, si queremos permitir múltiples filtros en la búsqueda:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
No necesariamente queremos poner los tipos de filtro (por ejemplo, productType y color) como nombres de solicitud como este:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Porque queríamos agrupar todas las entradas de filtro juntas.
Al final, ¿esto realmente importa? Es probable que haya tantas utilidades JSON por ahí que el tipo de entrada simplemente no importa tanto.
Sé que nuestros clientes de JavaScript que realizan llamadas AJAX a la API pueden apreciar las entradas JSON para facilitarles la vida.
[]
sintaxis no siempre es compatible (y a pesar de ser común, incluso puede violar las especificaciones de URI). Algunos servidores HTTP y lenguajes de programación preferirán simplemente repetir el nombre (por ejemploproductType=value1&productType=value2
)./user/
y en el cuerpo, voy a enviar{ q:{}, d: {} }
conq
como consulta por con el usuario será consultado en la base de datos yd
que los datos modificados.La forma estándar de pasar una lista de valores como parámetros de URL es repetirlos:
http://our.api.com/Product?id=101404&id=7267261
La mayoría del código del servidor interpretará esto como una lista de valores, aunque muchos tienen simplificaciones de un solo valor, por lo que es posible que tenga que buscar.
Los valores delimitados también están bien.
Si necesita enviar JSON al servidor, no me gusta verlo en la URL (que es un formato diferente). En particular, las URL tienen una limitación de tamaño (en la práctica, si no en teoría).
La forma en que he visto a algunos hacer una consulta complicada RESTfully es en dos pasos:
POST
sus requisitos de consulta, recibiendo una identificación (esencialmente creando un recurso de criterios de búsqueda)GET
la búsqueda, haciendo referencia a la ID anteriorfuente
Primero:
Creo que puedes hacerlo de 2 maneras
http://our.api.com/Product/<id>
: si solo quieres un discohttp://our.api.com/Product
: si quieres todos los registroshttp://our.api.com/Product/<id1>,<id2>
: como sugirió James puede ser una opción, ya que lo que viene después de la etiqueta Producto es un parámetroO el que más me gusta es:
Puede utilizar la propiedad Hypermedia como el motor del estado de aplicación (HATEOAS) de un RestFul WS y hacer una llamada
http://our.api.com/Product
que debería devolver las URL equivalenteshttp://our.api.com/Product/<id>
y llamarlas después de esto.Segundo
Cuando tienes que hacer consultas sobre las llamadas url. Sugeriría usar HATEOAS nuevamente.
1) Haz una llamada a
http://our.api.com/term/pumas/productType/clothing/color/black
2) Haz una llamada a
http://our.api.com/term/pumas/productType/clothing,bags/color/black,red
3) (Usando HATEOAS) Realice una llamada a ` http://our.api.com/term/pumas/productType/ -> reciba las urls todas las urls posibles de ropa -> llame a las que desee (ropa y bolsos) - > recibe las posibles URL de color -> llama a las que quieras
fuente
Es posible que desee ver RFC 6570 . Esta especificación de plantilla de URI muestra muchos ejemplos de cómo las URL pueden contener parámetros.
fuente
Primer caso:
Una búsqueda de producto normal se vería así
http://our.api.com/product/1
Así que estoy pensando que la mejor práctica sería que hagas esto
http://our.api.com/Product/101404,7267261
Segundo caso
Busque con parámetros de cadena de consulta, bien así. Me sentiría tentado a combinar términos con AND y OR en lugar de usar
[]
.PD: Esto puede ser subjetivo, así que haz lo que te haga sentir cómodo.
La razón para poner los datos en la url es para que el enlace se pueda pegar en un sitio / compartir entre los usuarios. Si esto no es un problema, utilice un JSON / POST en su lugar.
EDITAR: en la reflexión, creo que este enfoque se adapta a una entidad con una clave compuesta, pero no una consulta para múltiples entidades.
fuente
/
no debería estar allí ya que el URI aborda un recurso, no una colección.Me pondré del lado de la respuesta de nategood, ya que está completa y parecía satisfacer sus necesidades. Sin embargo, me gustaría agregar un comentario sobre la identificación de múltiples recursos (1 o más) de esa manera:
http://our.api.com/Product/101404,7267261
Al hacerlo, usted:
Complejice a los clientes obligándolos a interpretar su respuesta como una matriz, lo que para mí es intuitivo si hago la siguiente solicitud:
http://our.api.com/Product/101404
Cree API redundantes con una API para obtener todos los productos y la anterior para obtener 1 o más. Dado que no debe mostrar más de 1 página de detalles a un usuario por el bien de UX, creo que tener más de 1 ID sería inútil y se utilizaría exclusivamente para filtrar los productos.
Puede que no sea tan problemático, pero tendrá que manejar esto usted mismo del lado del servidor devolviendo una sola entidad (verificando si su respuesta contiene una o más) o dejar que los clientes la administren.
Ejemplo
Quiero pedir un libro de Amazing . Sé exactamente qué libro es y lo veo en la lista cuando navego por los libros de Terror:
Después de seleccionar el segundo libro, soy redirigido a una página que detalla la parte del libro de una lista:
¿O en una página que me da todos los detalles de ese libro solamente?
Mi opinión
Sugeriría usar la ID en la variable de ruta cuando se garantiza la unicidad al obtener los detalles de este recurso. Por ejemplo, las API a continuación sugieren varias formas de obtener los detalles de un recurso específico (suponiendo que un producto tenga un ID único y una especificación para ese producto tenga un nombre único y que pueda navegar de arriba hacia abajo):
En el momento en que necesite más de 1 recurso, sugeriría filtrar de una colección más grande. Por el mismo ejemplo:
Por supuesto, esta es mi opinión, ya que no se impone.
fuente