Para el sitio en el que estoy trabajando, estamos en el proceso de mejora de nuestras URLs para un tipo de recurso – en concreto, alejarse de los Identificadores numéricos hacia descriptivo único cadenas. Un ejemplo similar podría ser el cambio de la identificación de los usuarios numérica de la base de datos de IDENTIFICACIÓN para la identificación de ellos por nombre de usuario (no es nuestro caso específico, pero otros análogos). Así que una URL para acceder a la información de un usuario utilizado para mirar como:

/users/48573

Y ahora parece que

/users/thisisausername.

El único problema es que todavía tenemos que ser capaces de conseguirlos a través de Identificadores numéricos de alguna manera, para el legado de los consumidores de la API. No necesitamos la dirección Url de REST sí mismos para redirigir (por ejemplo, /users/48573 no debe redirigir a /users/thisisausername), sólo necesitamos un método para obtener los datos correctos usando el viejo identificador. La solución debe proporcionar una forma alternativa de acceder a la información de usuario (que convenientemente se incluye el nuevo identificador, nombre de usuario) por ID, o de acceso a sólo el nombre de usuario por ID. Algunas de las posibles soluciones podría ser:

  • El uso de un nodo para especificar algún método alternativo de identificación, por ejemplo, /users/byid/48573
  • Mediante una consulta de parámetro para especificar algún método alternativo de identificación, por ejemplo, /users/48573?fetchby=id o /users/48573?byid=true
  • El tratamiento de usuario-by-id como otro recurso, por ejemplo, /identifiers/username/48573

Que de estos (si alguna) es la más cercana a la de un DESCANSO apropiado? ¿Cómo lidiar con el problema?

  • Terminé la implementación del acceso a través de la no-principal-identificador de campos de búsqueda. Esta solución permite la obtención de varios tipos de recursos a través de varios campos, mientras que el mantenimiento de un único como el principal identificador. Por coherencia, a la «búsqueda de la» Api de devolver listas. Así que la manera oficial de acceso de un usuario es: /usuario/thisisausername y acceso por ID, tenemos: /users?id=48573 del mismo modo, podríamos buscar en un número de diferentes campos, como en: /users?firstName=Kelly Inspiración: jwyseur.blogspot.com/2008/12/uri-design-for-rest.html (consulte «búsqueda de un recurso»)
  • Así que despejó el almacenamiento en caché? Tengo el mismo problema que tú, pero no puede resolver el problema a través de los parámetros de consulta que quitar uno de los principales beneficios de una API REST. Me gusta tu primera viñetas sugerencia…
InformationsquelleAutor Kelly Ellis | 2009-05-08

5 Comentarios

  1. 31

    Creo que la adición de un segmento de la ruta/prefijo es la mejor respuesta. Ya que estas son las únicas claves secundarias, este no es el mismo de la búsqueda (que devuelve un conjunto de elementos), por lo que el uso de los parámetros de la consulta (que no están en caché) no parece la mejor opción.

    Personalmente, tengo la intención de utilizar una ruta de acceso prefijo de segmento delimitado por «=», como el «nombre=» o «email=»:

    user/123456
    user/name=john.doe
    user/[email protected]
    

    Esto es funcionalmente equivalente a la adición de un segmento de la ruta (por ejemplo, «usuario/nombre/juan.doe»), pero que se siente a mí me gusta mapas más estrechamente con el modelo conceptual. Por supuesto, este es un detalle insignificante, ya APIs RESTful no debería especificar un URI fijo de la estructura de todos modos.

    No utilizando los parámetros de la consulta también permite sub-recursos para ser accedido de forma natural:

    user/name=john.doe/inbox/df87bhJXrg63
    

    Marcos de trabajo como Java JAX-RS de apoyo utilizando el delimitador desea:

    @GET
    @Path("user/{id}")
    User getUser(@PathParam("id") UUID id);
    
    @GET
    @Path("user/name={name}")
    User getUserByName(@PathParam("name") String name);
    
    @GET
    @Path("user/email={email}")
    User getUserByEmail(@PathParam("email") String email);
    
    • Este es un enfoque interesante que no he visto antes. Se resuelve el problema muy bien, pero yo simplemente no puede conseguir más allá del hecho de que ver el signo de igual fuera de los parámetros de la consulta parece que va a causar confusión…
    • Además, no es muy relajante. qué, exactamente, es el nombre de la colección=juan.doe? Para mí debe ser una matriz de parámetros: usuario;nombre=juan.doe/bandeja de entrada/df87… blog.2partsmagic.com/restful-uri-design
    • Creo que se está perdiendo el punto. name=john.doe no debe ser una colección, desde name es un identificador único. Estamos buscando exactamente un objeto o un error. user;name=john.doe se ve como una búsqueda. Me gustaría esperar a que vuelva la misma representación que user, que es una colección.
    • Más apropiado sería /[email protected] (o, cuando correctamente codificado: /user?email=john.doe%40john.doe)
  2. 16

    Su primera opción es probablemente la mejor.

    La búsqueda de usuarios por ID:

    /users/id/48573
    

    Buscar usuarios por nombre corto:

    /users/name/thisisausername
    

    Si se deja que el parámetro de la ruta, siempre se puede predeterminado para su nuevo formato de nombre de usuario.

    Otra opción que he visto un poco es el uso de los parámetros de la consulta como la siguiente:

    /users?id=48573
    /users?name=thisisausername
    

    Creo que la primera se ve un poco más claro y legible.

    • corto y al punto, perfecto!
  3. 0

    Muy una vieja pregunta, pero tuve el mismo y por fin encontré la solución :
    uso de expresiones regulares en su camino param.

    He aquí cómo me codificado que el caso de uso

    @GET
    @Path("/{id : \d+}")
    @Produces(APPLICATION_JSON)
    public Response getById(@PathParam("id") long id) {
     <<your code>>
    }
    
    @GET
    @Path("/{name}")
    @Produces(APPLICATION_JSON)
    public Response getByName(@PathParam("name") String name) {
     <<your code>>
    }
    
    • ¿Qué pasa si el nombre del usuario es numérico? Si un usuario puede elegir su nombre y libremente decide usar solamente un número de su falla.
    • se produce un error o no. Usted tiene que hacer controles en la creación (POST) de la solicitud, y puede rechazar numérico único nombre.
    • la Respuesta del público a crear(@Usuario Válido de usuario) y anotar su modelo de bean validation. Ejemplo : debe comenzar con Mayúscula, 50 char max @@Patrón(regexp = «[A-Z][a-zA-Z_0-9- ]{0,49}», mensaje = «nombre no válido») private String nombre;
  4. -3

    Su API no es Reparador si esto es un problema. A cita Roy Fielding:

    Una API REST no deben definir de recursos fijos o nombres de las jerarquías (una evidente acoplamiento de cliente y servidor). Los servidores deben tener la libertad de controlar su propio espacio de nombres. En su lugar, permitir a los servidores para instruir a los clientes sobre cómo construir apropiado URIs, tal como se hace en los formularios HTML y URI plantillas, mediante la definición de las instrucciones dentro de los medios de comunicación y tipos de enlace de relaciones. [Error aquí implica que los clientes están asumiendo un recurso, debido a la estructura fuera de la banda de la información, tales como un dominio específico de la norma, que es la orientada a datos equivalente a la RPC del acoplamiento funcional].

    Una API REST debe ser ingresado sin conocimiento previo más allá de la inicial de la URI (marcador) y el conjunto de la normalización de los tipos de medios que son adecuados para el público objetivo (es decir, que se espera para ser entendido por cualquier cliente que puede utilizar la API). A partir de ese momento, todos del estado de la aplicación de transición debe ser impulsada por el cliente de selección de servidor proporciona opciones que están presentes en el recibido de las representaciones o implícita por parte del usuario de la manipulación de esas representaciones. Las transiciones pueden ser determinados (o limitada) por el cliente, conocimiento de los tipos de medios, recursos y mecanismos de comunicación, tanto de los que se puede mejorar sobre la marcha (p. ej., código-on-demand). [Error aquí implica que fuera de banda de la información es la conducción de la interacción en lugar de hipertexto.]

    • Esto no es una respuesta a su pregunta. Una API REST puede apoyar HATEOAS largo de todo el día, y sin embargo, el servidor de los desarrolladores todavía necesita preocuparse acerca de los problemas de la URI de diseño.
  5. -3

    Me gustaría considerar la calificación de la cuerda con un sufijo opcional:

    /users/48573/id
    
    /users/48573/name
    

    Si usted recibe una cadena de texto sin el sufijo:

    /users/48573
    

    a continuación, comprobar la cadena y ver si es un IDENTIFICADOR o Nombre.

    Si usted consigue solamente una IDENTIFICACIÓN válida, pero no es un nombre, es una recuperación de IDENTIFICACIÓN equivalente a:

    /users/48573/id
    

    Si usted consigue solamente un nombre, a continuación, es una recuperación por Nombre equivalente a:

    /users/48573/name
    

    Si se puede recuperar el valor por ID o Nombre, a continuación, volver a 300 respuesta de error y devolver los enlaces a ambas posibilidades para el cliente:

    /users/48573/id
    
    /users/48573/name
    

    El legado de los consumidores seguir trabajando «como está», excepto por el ocasional ocurrencia de duplicar nombre/IDENTIFICACIÓN de pares de donde reciben la nueva 300 de error de respuesta.

    • Esto no es DESCANSO. Esto es sólo RPC.

Dejar respuesta

Please enter your comment!
Please enter your name here