[Este es un followup a un comentario que hice esta tarde durante la
ponencia de Juan Quemada y Joaquin Salvachua.]
Cuando comente lo de los hidden fields quedo la cosa ahi como medio
descolgada porque me di cuenta de que necesitaria elaborar el tema
para explicar la analogia pero no me parecia que fuera el momento
adecuado, asi que lo deje correr, pero sigo por aqui :-).
Cuando uno usa un hidden field para pasarse contexto en web
tradicional esta enviando al cliente datos que son necesarios para la
siguiente peticion. De manera que la siguiente peticion acarrea los
datos necesarios para poder servirse. El campo se hace oculto por
usabilidad, no por seguridad. Se hace oculto porque en la web humana
ese es un campo que tecnicamente necesitas pero que al usuario no le
aporta nada, y por tanto no se lo muestras. Por supuesto, como todo en
web, uno no puede confiar en que lo que viene del cliente no haya
podido ser manipulado y has de validar que el request tiene sentido,
que el usuario esta autorizado a hacer lo que pide, etc.
Bien, en REST una de las premisas es que las peticiones debe
transportar todo lo necesario para que pueda realizarse la operacion
demandada sobre el recurso al que te refieres. Por tanto esa practica
es RESTful.
Un ejemplo de uso “analogo” de campo hidden en servicios web RESTful
es el modelado de transacciones como hacen en el libro de O’Reilly que
Juan y Joaquin recomendaron.
Cuando en REST se dice que todo son recursos no se quiere decir que
los recursos mapeen a tu modelo de datos uno a uno. El concepto de
recurso esta abierto y depende de cada aplicacion, de lo que tenga
sentido en ella. Puede ser algo logico (/releases/latest versus /
releases/{id}) y abstracto, ad-hoc, como seria el de transaccion. Si
tu aplicacion necesita transacciones, visto RESTful, es que en tu
aplicacion aparece un recurso “transaccion” que no es ni mas ni menos
en el modelo conceptual que el recurso mas llano “account”.
Para realizar una operacion bancaria haces lo siguiente, primero creas
un recurso transaccion:
POST /transaction/account-transfer
y devuelves un 201 Created con la URL del recurso creado en Location
(esto es estandard):
201 Created
Location: /transaction/account-transfer/45
El contrato con el cliente, documentado, es que las operaciones a
realizar dentro de esa transaccion van ahi debajo:
PUT /transactions/account-transfer/45/account/checking/23
balance=150
…
y cuando terminaste haces un DELETE del recurso transaccion para
rollback, o bien haces un commit
PUT /transactions/account-transfer/45
committed=true
Bien, eso en mi opinion es analogo a la tecnica del hidden field en
web humana. Le has enviado al cliente algo para que te lo vaya pasando
en subsiguientes peticiones. Si el request es invalido (el recurso
transaccion no viene, o no existe, o tratas de usar una que no es tuya
manipulando el ID, etc.) devuelves un 4xx. Esas son las mismas
validaciones que harias con un campo oculto tambien.
– fxn
P.D.: Saludos a todos ya desde Barcelona, ha sido una conferencia
cojonuda :-).