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
).