2008-11-13 20 views
11

Me gustaría hacer que mi aplicación cumpla en cierta medida con REST. Estoy utilizando Rails en el back-end y GWT en la interfaz. Me gustaría hacer actualizaciones y eliminaciones. Me doy cuenta de que puedo hacer algo como mydomain.com/:id/delete (GET) y lograr lo mismo. Sin embargo, como dije anteriormente, me gustaría tener un backend que cumpla con REST. Por lo tanto, quiero hacer mydomain.com/:id (DELETE) y hacer que invoque implícitamente mi método de eliminación.¿Cómo puedo emular PUT/DELETE para Rails y GWT?

Ahora, tengo entendido que si un navegador (mi navegador es GWT RequestBuilder) no admite DELETE/GET, Rails de alguna manera realiza esta tarea con un POST y algún otro parámetro de url. Entonces, ¿cómo puedo lograr esto con un GWT RequestBuilder?

Respuesta

7

Rails lo hace con los atributos ocultos. La forma más sencilla de resolver esto sería crear una nueva aplicación de rieles, generar un andamio y echar un vistazo al HTML en un navegador.

Prueba esto:

rails jp 
cd jp 
./script/generate scaffold RequestBuilder name:string 
rake db:migrate 
./script/server 

A continuación, vaya a http://localhost:3000/request_builders, haga clic en Nuevo y echar un vistazo en el HTML. Verá algo como:

<form action="/request_builders" class="new_request_builder" 
    id="new_request_builder" method="post"> 
    <div style="margin:0;padding:0"> 
    <input name="authenticity_token" type="hidden" value="e76..." /> 
    </div> 

Esto es una creación, el método es POST. Introduzca un nombre, salvo despues Edit:

<form action="/request_builders/1" class="edit_request_builder" 
    id="edit_request_builder_1" method="post"> 
    <div style="margin:0;padding:0"> 
    <input name="_method" type="hidden" value="put" /> 
    <input name="authenticity_token" type="hidden" value="e76..." /> 
    </div> 

Por supuesto, el formulario se envía con la POST, pero los carriles HADS un campo oculto para simular una solicitud PUT. Lo mismo para su eliminación, pero el andamio lo hará con un poco de Javascript:

var m = document.createElement('input'); 
m.setAttribute('type', 'hidden'); 
m.setAttribute('name', '_method'); 
m.setAttribute('value', 'delete'); 

Para que este trabajo con otro front-end, que tendrá que ambos:

  • utiliza el mismo estilo URL como/request_builders/1 (URL REST) ​​
  • Incluir los campos ocultos (rieles truco)
+2

Desafortunadamente, esto no puede considerarse una solución completa, ya que solo funciona para datos codificados en URL (formularios), y no funciona con JSON o XML, que es la forma más común de hacer solicitudes con GWT – skrat

6

como @skrat dicho esto, el _method=PUT solución no funciona para cualquier tipo de cuerpo cuando planees re Content-Type no es x-www-form-urlencoded, p. XML o JSON. Afortunadamente, hay una solución encabezado así:

https://zcox.wordpress.com/2009/06/17/override-the-http-request-method-in-jersey/

Así que para actualizar un recurso REST, acaba de hacer un POST a su dirección y añadir la cabecera X-HTTP-Method-Override: PUT. Rails interpretará esto como un PUT a la dirección.