2012-05-18 8 views
6

Me gustaría que mi API tuviera una solicitud de validación solamente. Por ejemplo, si tengo un enlace como:API RESTful: qué combinación de MÉTODO/ENCABEZADO usar para validación solo

http://api.somesite.com/users/12345 

y el usuario está llenando un formulario de información sobre un cliente que con el tiempo se PATCH/PUT/POST a ese recurso. A medida que el usuario completa el formulario, es posible que desee enviar periódicamente al servidor su representación parcialmente completa y actualizada para que pueda mostrar la validación en tiempo real de su entrada (por ejemplo, "Ese nombre de usuario ya está tomado", "Esa contraseña es demasiado corto").

No hay un MÉTODO o ENCABEZADO HTTP estándar que parezca permitir este comportamiento en ese mismo recurso. Parece que mis opciones son:

  1. crear un nuevo recurso subordinado para la validación
  2. Utilice un encabezado personalizado (x-somesite-validación-only) y poner indicando que quiero para validar pero no guardar
+0

pregunta relacionada: http : //stackoverflow.com/questions/8368931/how-should-i-design-a-restful-url-to-validate-an-object – suing

+0

Gran pregunta. Acabo de toparme con este tema también, y estoy debatiendo entre los mismos dos enfoques. Inclinándose hacia el encabezado personalmente. Inspirado por el parámetro '--dry-run' de git en muchos de sus comandos. –

Respuesta

2

Algunas opciones

1) Utilizar encabezado personalizado
2) Poner algo en la cadena de consulta que indica para validar solo
3) Use Action URl por ej. \ IndividualClient \ 123 \ actions \ Validate \ Invoke {sección 19 aquí http://restfulobjects.files.wordpress.com/2011/11/restful-objects-spec-052.pdf}
4) URL jerárquica p. Ej. \ IndividualClient \ 123 \ Validación

De esta post encuentro este consejo

hacer uso post cada vez que tenga que hacer algo que se siente RPC-como Do utilizar GET para cosas como cálculos, a menos que su entrada es grande, en cuyo uso del caso POST

Con respecto a su pregunta específica, POST se debe utilizar para # 4 y # 5. Estas operaciones caen> bajo la directriz "RPC-like" arriba. Para # 5, recuerde que POST no necesariamente tiene que> usar Content-Type: application/x-www-form-urlencoded. Esto podría ser fácilmente una carga útil JSON o CSV.

Esto es lo que estoy considerando:

Este es el complemento de un recurso:
usuario/validación
POSTAL
Solicitud: UserResource
Respuesta: ValidationResult
Códigos de Respuesta 200, 400. 404.500

Esta es la actualización de un recurso
usuario/204/validación
POSTAL
Solicitud: UserResource,
Respuesta: ValidationResult Códigos de Respuesta 200, 400. 404. 500

+0

Terminé implementando algo muy similar a esto, pero con el interés de no reescribir mi enrutador de software, simplemente lo hice parte de la cadena de consulta: POST/user/204? Validate – Fleep

0

La tercera opción sería implementar una función de validación en el cliente. Esta función enviaría una solicitud específica cuando necesita información específica.

Por ejemplo, realmente no necesita enviar una solicitud para verificar si una contraseña es demasiado corta. Pero podría enviar una sola solicitud para verificar si existe un nombre de usuario.

Esta es la forma en la validación se realiza con el Ajax, que por cierto está utilizando la API reparador (HTTP) :)

+1

Argumentaría que AJAX necesariamente usa HTTP como protocolo de transferencia, pero no necesariamente tiene que implementar prácticas RESTful como API * de manera significativa *. Decir "todo HTTP es RESTful" pasa por alto el punto. – Fleep

+0

Además, voy a validar por el lado del servidor de todos modos, y con el interés de no repetirme, preferiría poder mantener mi código de validación estandarizado y en un solo lugar. La validación en tiempo real que impacta en la IU, como la validación de contraseñas, funcionaría bien con una validación no crítica del lado del cliente. Pero no es un reemplazo de lo que estoy preguntando arriba. – Fleep

+0

Eso es el doble de la cantidad de trabajo de desarrollo (es decir, en el lado del cliente y del servidor). – Pierre

Cuestiones relacionadas