Come posso creare un sito Web in stile RESTful se i moduli HTML consentono solo di utilizzare GET e POST?

3

Diciamo che voglio creare un sito web in cui gli utenti saranno in grado di creare, modificare ed eliminare alcuni tipi di risorse, ad esempio i post.

Ho creato un'API RESTful, quindi l'utente può creare un post inviando una richiesta PUT a link , cancellalo inviando la richiesta DELETE, ecc.

Ma la maggior parte degli utenti non sa nulla delle richieste HTTP. Vogliono fare clic sul pulsante "Nuovo post" e creare il nuovo post. Ma HTML mi consente solo di usare GET e POST.

Come posso creare un pulsante "Nuovo post" che invierà una richiesta PUT? O la "RESTful creation / deletion" è implementata in un modo completamente diverso?

Diciamo che sto usando Spring + Thymeleaf.

    
posta infranoise 10.07.2015 - 16:44
fonte

2 risposte

5

Il pulsante "Nuovo post" andrebbe in un modulo per consentire all'utente di inserire le informazioni per un nuovo post. Quando l'utente invia tale modulo, il browser invia correttamente tali dati tramite HTTP POST (usa POST per creare).

Una modifica sottomissione userebbe PUT o PATCH a seconda che si tratti di una sostituzione (eliminare le proprietà mancanti) o dell'aggiornamento (modificare solo le proprietà inviate), rispettivamente.

Generalmente creiamo un XMLHTTPRequest (XHR) utilizzando JavaScript per eventi diversi da GET o POST.

jQuery.ajax('/products/42', {method: 'PUT', data: product_data});

jQuery Documenti: link

Inoltre, Rails userà un parametro "_method" nei POST per forzare un'azione differente sul server (come PUT o PATCH).

    
risposta data 10.07.2015 - 17:42
fonte
1

How can I create a "New post" button that will send a PUT request?

Non farlo. Non quando si restituisce l'HTML.

Or is "RESTful creation/deletion" implemented in a totally different way?

Leggermente la domanda sbagliata. REST non si cura di come lo fai, al di là della regola che stai usando i controlli ipermediali e i tipi di media. HTTP consente PUT e DELETE come metodi. Ma HTML è un tipo di media ben specificato che non supporta PUT e DELETE.

Quindi, se si desidera "Nuovo post", in un'applicazione html riposante, si specifica un modulo con il metodo POST. Se si desidera "Elimina post", si specifica un modulo con il metodo POST.

PUT e DELETE sono idempotenti. Se lo vuoi per POST, devi fare un po 'di lavoro extra. I moduli html dovrebbero già avere in essi URI univoci (l'URI identifica la risorsa, ma non promette che la "risorsa" esiste già). Aggiungi controlli alla gestione dei moduli pubblicati che controllano se un messaggio con quell'identificatore univoco è già stato elaborato.

Un browser che legge il tuo html non saprà che il modulo è idempotente, ma puoi documentarlo e altri utenti possono usare quella conoscenza. Se steste davvero andando fuori tutto, presumibilmente avresti due diversi tipi di media: text / html per i browser, e una rappresentazione text / vnd.infranoise + html disponibile per altri client. Dichiarazione di non responsabilità: non conosco alcuna API che in realtà faccia ciò per le rappresentazioni html.

Gli identificatori univoci richiedono un trattamento speciale. Quando tutte le copie del modulo iniziano nello stesso stato, l'URI / x / y / myform si prende cura di te. Ma qui vogliamo una versione unica del modulo: vogliamo che il modulo specifichi quale elemento stiamo creando / eliminando. Per eliminare, potremmo essere in grado di utilizzare itemId: / z / y / x? ItemId = 12345. Per creare, non abbiamo ancora un ID, quindi lo risolviamo con 303 (Vedi Altro). Facciamo in modo che il collegamento "crea" passi a / a / b / c e che generi un nuovo id, quindi reindirizziamo il browser a / a / b / c? ItemId = ...

Infine, vi è la domanda su quale sia l'ortografia URI da usare. REST non interessa. Ma le linee guida di progettazione URI comuni indicano correttamente che le risorse sono nomi.

Esistono molte API per manipolare le risorse nelle raccolte, ma la maggior parte di quelle che ho trovato non sono limitate ai metodi HTML. Un approccio sarebbe quello di mantenere due collezioni; pubblica una raccolta per creare il documento, pubblica la raccolta opposta per rimuovere il documento - pensa "cestino", piuttosto che elimina.

Un'altra possibilità sarebbe quella di accettare il fatto che le risorse per l'invio di comandi di creazione / cancellazione sono moduli e possono essere ottenuti dalla raccolta moduli

/forms/createPostForms?itemId=12345
/forms/deletePostForms?itemId=12345

Vuoi andare in bicicletta?

/forms/createPostForms?itemId=12345
/forms/post/12345/create
/forms/post?type=create&itemId=12345
/forms/post/12345,create
/posts/12345/create
/posts/12345/forms/create
/posts/12345/forms?type=create
/nonsequiturs?itemId=12345&type=post&action=create

REST non interessa. HTML non interessa. I browser conformi non si preoccupano. Il tuo HttpRequestHandler si interessa solo nella misura in cui ha bisogno di conoscere i template URI giusti da usare.

    
risposta data 05.02.2016 - 07:38
fonte

Leggi altre domande sui tag