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.