2008-11-13 4 views
11

Ich möchte meine Anwendung etwas REST-konform machen. Ich verwende Rails am Backend und GWT am Frontend. Ich möchte Updates machen und löschen. Mir ist klar, dass ich etwas wie mydomain.com/:id/delete (GET) machen kann und dasselbe erreichen kann. Wie bereits erwähnt, hätte ich gerne ein REST-konformes Backend. Daher möchte ich mydomain.com/:id (DELETE) ausführen und meine delete-Methode implizit aufrufen.Wie kann ich PUT/DELETE für Rails und GWT emulieren?

Nun, ich verstehe, dass, wenn ein Browser (mein Browser GWT RequestBuilder) keine DELETE/GET unterstützt, Rails diese Aufgabe irgendwie mit einem POST und einem anderen URL-Parameter erledigt. Also, wie kann ich dies mit einem GWT RequestBuilder erreichen?

Antwort

7

Schienen tut dies mit versteckten Attributen. Der einfachste Weg, dies herauszufinden, wäre, eine neue Rails-Anwendung zu erstellen, ein Scaffold zu generieren und sich den HTML-Code in einem Browser anzusehen.

Try this:

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

Dann http://localhost:3000/request_builders navigieren, klicken Sie auf Neu und haben einen Blick auf die HTML. Sie sehen etwas wie:

<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> 

Dies ist eine Schöpfung, Methode ist POST. Geben Sie einen Namen und speichern Sie dann bearbeiten:

<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> 

Natürlich wird das Formular mit POST gesendet, aber Rails HADS ein verstecktes Feld eine PUT-Anforderung zu simulieren. Das Gleiche gilt für Löschen, aber das Gerüst wird es mit ein wenig Javascript tun:

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

mit einem anderen Front-End, diese Arbeit zu haben, werden Sie beide haben:

  • den gleichen Stil verwenden URL wie/request_builders/1 (RESTful URLs)
  • Fügen Sie die ausgeblendeten Felder (Rails Trick)
+2

Leider kann dies nicht als vollständige Lösung betrachtet werden, da es nur für URL-codierte Daten (Formulare) funktioniert und nicht mit JSON oder XML funktioniert, was bei GWT häufiger der Fall ist – skrat

6

wie @skrat sagte, die _method=PUT Abhilfe funktioniert nicht für jede Art von Körper wHE B. Content-Type ist nicht x-www-form-urlencoded, z.B. XML oder JSON. Zum Glück gibt es eine Kopf Abhilfe als auch ist:

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

So eine REST-Ressource zu aktualisieren, einfach eine POST an seine Adresse und fügen Sie den Header X-HTTP-Method-Override: PUT. Rails wird dies als PUT an die Adresse interpretieren.

Verwandte Themen