2008-11-13 16 views
11

Chciałbym, aby moja aplikacja była w pewnym stopniu zgodna z REST. Używam Railsów na zapleczu i GWT na frontend. Chciałbym aktualizować i usuwać. Zdaję sobie sprawę, że mogę zrobić coś takiego jak moja_domena.com/:id/delete (GET) i osiągnąć to samo. Jednak, jak już wcześniej wspomniałem, chciałbym mieć backend zgodny z REST. Tak więc chcę zrobić mydomain.com/id (DELETE) i mam go domyślnie wywołać moją metodę usuwania.Jak mogę emulować PUT/DELETE dla Railsów i GWT?

Teraz rozumiem, że jeśli przeglądarka (moja przeglądarka to GWT RequestBuilder) nie obsługuje funkcji DELETE/GET, Railsy w jakiś sposób wykonują to zadanie z POST i innymi parametrami adresu URL. Jak mogę to osiągnąć za pomocą GWT RequestBuilder?

Odpowiedz

7

Railsi to z ukrytymi atrybutami. Najłatwiejszym sposobem rozwiązania tego problemu byłoby stworzenie nowej aplikacji szyny, wygenerowanie rusztowania i spojrzenie na kod HTML w przeglądarce.

Spróbuj tego:

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

Następnie przejdź do http://localhost:3000/request_builders, kliknij na nowe i spojrzeć na HTML. Zobaczysz coś takiego:

To jest kreacja, metoda to POST. Wprowadź nazwę, chyba wtedy 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> 

Oczywiście formularz jest wysyłany z POST, ale Rails hads ukryte pole, aby symulować żądania PUT. Sama do usunięcia, ale rusztowanie zrobi to z odrobiną javascript:

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

mieć tę pracę z innym front-end, trzeba będzie zarówno:

  • Użyj tego samego stylu URL takich jak/request_builders/1 (REST URL)
  • Dołącz ukrytych pól (Szyny podstęp)
+2

Niestety, nie można tego uznać za kompletne rozwiązanie, ponieważ działa ono tylko dla danych zakodowanych w URL (formularze) i nie działa z JSON lub XML, co jest częstszym sposobem wykonywania żądań z GWT – skrat

6

jak @skrat powiedziane, _method=PUT obejście nie działa dla każdego rodzaju ciała trakt ponownie Content-Type nie jest x-www-form-urlencoded, np. XML lub JSON. Na szczęście, istnieje obejście nagłówka, a także:

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

Więc zaktualizować zasób odpocząć, po prostu zrobić pocztą na jego adres i dodać nagłówek X-HTTP-Method-Override: PUT. Railsy interpretują to jako PUT na adres.