En pocas palabras, estás haciendo esto completamente al revés.
No debería enfocarse en esto desde las URL que debería usar. Las URL serán efectivamente "gratis" una vez que haya decidido qué recursos son necesarios para su sistema Y cómo representará esos recursos, y las interacciones entre los recursos y el estado de la aplicación.
Para citar a Roy Fielding
Una API REST debería dedicar casi todo su esfuerzo descriptivo a definir los tipos de medios utilizados para representar los recursos y dirigir el estado de la aplicación, o para definir nombres de relaciones extendidas y / o marcado habilitado para hipertexto para los tipos de medios estándar existentes. Cualquier esfuerzo dedicado a describir qué métodos usar en qué URI de interés debería definirse por completo dentro del alcance de las reglas de procesamiento para un tipo de medio (y, en la mayoría de los casos, ya definido por los tipos de medios existentes). [El fracaso aquí implica que la información fuera de banda está impulsando la interacción en lugar del hipertexto].
Las personas siempre comienzan con los URI y piensan que esta es la solución, y luego tienden a perder un concepto clave en la arquitectura REST, en particular, como se citó anteriormente, "La falla aquí implica que la información fuera de banda impulsa la interacción en lugar del hipertexto". "
Para ser honesto, muchos ven un montón de URI y algunos GET y PUT y POST y piensan que REST es fácil. RESTO no es fácil. RPC sobre HTTP es fácil, mover bloques de datos de un lado a otro a través de cargas HTTP es fácil. REST, sin embargo, va más allá de eso. REST es un protocolo agnóstico. HTTP es muy popular y apto para sistemas REST.
REST vive en los tipos de medios, sus definiciones y cómo la aplicación impulsa las acciones disponibles para esos recursos a través del hipertexto (enlaces, efectivamente).
Hay diferentes puntos de vista sobre los tipos de medios en los sistemas REST. Algunos prefieren cargas útiles específicas de la aplicación, mientras que otros prefieren elevar los tipos de medios existentes a roles apropiados para la aplicación. Por ejemplo, por un lado, tiene esquemas XML específicos diseñados para su aplicación en lugar de usar algo como XHTML como su representación, tal vez a través de microformatos y otros mecanismos.
Creo que ambos enfoques tienen su lugar, el XHTML funciona muy bien en escenarios que se superponen tanto con la web impulsada por humanos como por la máquina, mientras que los primeros tipos de datos más específicos que creo que facilitan las interacciones de máquina a máquina. Creo que la mejora de los formatos de los productos básicos puede dificultar la negociación de contenido. "application / xml + yourresource" es mucho más específico como tipo de medio que "application / xhtml + xml", ya que este último puede aplicarse a muchas cargas útiles que pueden o no ser algo en lo que un cliente de máquina está realmente interesado, ni tampoco determinar sin introspección.
Sin embargo, XHTML funciona muy bien (obviamente) en la web humana donde los navegadores web y la representación son muy importantes.
Su aplicación lo guiará en ese tipo de decisiones.
Parte del proceso de diseño de un sistema REST es descubrir los recursos de primera clase en su sistema, junto con los recursos de soporte derivados, necesarios para soportar las operaciones en los recursos primarios. Una vez que se descubren los recursos, la representación de esos recursos, así como los diagramas de estado que muestran el flujo de recursos a través del hipertexto dentro de las representaciones como el próximo desafío.
Recuerde que cada representación de un recurso, en un sistema de hipertexto, combina la representación real del recurso junto con las transiciones de estado disponibles para el recurso. Considere cada recurso como un nodo en un gráfico, siendo los enlaces las líneas que salen de ese nodo a otros estados. Estos enlaces informan a los clientes no solo sobre lo que se puede hacer, sino también sobre lo que se requiere para ellos (ya que un buen enlace combina el URI y el tipo de medio requerido).
Por ejemplo, puede tener:
<link href="http://example.com/users" rel="users" type="application/xml+usercollection"/>
<link href="http://example.com/users?search" rel="search" type="application/xml+usersearchcriteria"/>
Su documentación hablará sobre el campo rel denominado "usuarios" y el tipo de medio de "aplicación / xml + su usuario".
Estos enlaces pueden parecer redundantes, todos están hablando con el mismo URI, más o menos. Pero no lo son.
Esto se debe a que para la relación "usuarios", ese enlace está hablando de la colección de usuarios, y puede usar la interfaz uniforme para trabajar con la colección (GET para recuperarlos a todos, DELETE para borrarlos a todos, etc.)
Si PUBLICA en esta URL, deberá pasar un documento "application / xml + usercollection", que probablemente solo contendrá una única instancia de usuario dentro del documento para que pueda agregar el usuario, o no, quizás, para agregar varios en una vez. Quizás su documentación sugiera que simplemente puede pasar un solo tipo de usuario, en lugar de la colección.
Puede ver lo que requiere la aplicación para realizar una búsqueda, tal como se define en el enlace "buscar" y su tipo de medio. La documentación del tipo de medio de búsqueda le indicará cómo se comporta esto y qué esperar como resultados.
La conclusión aquí, sin embargo, es que los URI en sí mismos son básicamente poco importantes. La aplicación controla los URI, no los clientes. Más allá de unos pocos "puntos de entrada", sus clientes deben confiar en los URI proporcionados por la aplicación para su trabajo.
El cliente necesita saber cómo manipular e interpretar los tipos de medios, pero no necesita preocuparse por dónde va.
Estos dos enlaces son semánticamente idénticos a los ojos de los clientes:
<link href="http://example.com/users?search" rel="search" type="application/xml+usersearchcriteria"/>
<link href="http://example.com/AW163FH87SGV" rel="search" type="application/xml+usersearchcriteria"/>
Entonces, concéntrate en tus recursos. Concéntrese en sus transiciones de estado en la aplicación y cómo se logra mejor.