2011-05-16 9 views
31

Me gustaría diseñar un URI de búsqueda RESTful usando parámetros de consulta. Por ejemplo, este URI devuelve una lista de todos los usuarios:¿Cómo puedo usar HATEOAS y los parámetros de consulta para la búsqueda RESTful?

GET/usuarios

Y los primeros 25 usuarios con el apellido "Harvey":

GET/usuarios? apellido = Harvey & maxResults = 25

¿Cómo puedo usar para describir lo hipermedia parámetros de consulta son permitidos por los usuarios "/" reso ¿urce? Noté que el nuevo Google Tasks API solo documenta todos los parámetros de consulta en la guía de referencia. Documentaré la lista, pero me gustaría hacerlo también con HATEOAS.

¡Gracias de antemano!

+1

Ojalá pudiera hacer +10 a esta pregunta. –

Respuesta

21

Utilizando la sintaxis descrita en el actual proyecto de URI template spec puede hacer:

/users{?surname,maxresults} 
+1

La especificación de plantilla URI parece muy útil. –

6

La otra opción es utilizar un formulario HTML:

<form method="get" action="/users"> 
    <label for="surname">Surname: </label> 
    <input type="text" name="surname"/> 
    <label for="maxresults">Max Results: </label> 
    <input type="text" name="maxresults" value="25"/> <!-- default is 25 --> 
    <input type="submit" name="submitbutton" value="submit"/> 
</form> 

Una forma como ésta documenta completamente la opciones disponibles y cualquier valor por defecto, crea la URL especificada y se puede anotar con cualquier documentación adicional que desee colocar allí.

+2

Tal vez me esté faltando el punto, pero esto no funcionará si su recurso no es HTML. –

+1

Este formulario html es una forma de formular la solicitud GET, lo que obtienes es en cualquier formato de tipo de medio que pidas ... podría ser (y probablemente sería) algo completamente diferente. – HDave

1

No soy experto descanso, pero permítanme lanzar en mi ¢ 2:

En la Web humana, formularios HTML a menudo se utilizan para construir un URI a una representación de los resultados de búsqueda. El problema es que la web programable no tiene formularios. Pero se puede definir fácilmente algo algo análogo a sí mismo, es decir:

  1. definir un tipo de soporte para las descripciones de búsqueda, digamos application/prs.example.searchdescription+json (pero Tomar nota del P. S. al final de esta respuesta);

  2. Exponer un sub-recurso que representa una búsqueda de usuarios, /users/search.

El segundo paso se logrará mediante la vinculación a ese sub recurso desde otro lugar. Por ejemplo, supongamos que el cliente ha solicitado GET /users. Podría recibir algo como esto:

{ _links: [ …, { rel: "search", href: "https://stackoverflow.com/users/search" }, …] } 

El cliente podría seguir ese enlace y POST una especificación de búsqueda a ese recurso URI, por ejemplo:

POST /users/search 
… 
Content-Type: application/prs.example.search-definition+json 
… 

{ criteria: { surname: "Harvey" }, maxResults: 25 } 

Aquí, criteria contiene una representación (parcial) de los objetos que se encuentran Esto podría convertirse en una descripción arbitrariamente compleja.

a una solicitud como se describe anteriormente, el servidor podría responder con código de estado 200 OK y, en el cuerpo de la entidad, un enlace a un recurso que representa los resultados de la búsqueda publicado:

{ _links: [ { rel: "results", href: "/users?surname=Harvey&maxResults=25" } ] } 

el cliente puede luego navegue al URI con la relación results para obtener los resultados de la búsqueda, sin tener que ensamblar un URI.

P.S.: Cuando originalmente escribí esto, todavía no me había dado cuenta de que definir nuevos tipos de medios todo el tiempo puede volverse problemático. Mark Nottingham blogged about "media type proliferation" and how to combat it haciendo uso de the profile link relation.

Cuestiones relacionadas