Domanda

Il quadro Agavi utilizza la richiesta PUT per creare e POST per l'aggiornamento delle informazioni. Di solito in REST questo è usato il contrario (spesso riferimento alle POST aggiunta di informazioni, mentre PUT sostituire l'intero record di dati).

Se ho ben capito, la questione importante è che PUT deve essere idempotente, mentre POST non ha questo requisito. Pertanto, wounder come la creazione di un nuovo record può essere idempotente (cioè richiesta multipla non portano a molteplici creazioni di un record) in particolare quando solitamente ORM utilizza un id come chiave primaria e l'id di un nuovo record non sarebbe noto al cliente (dal momento che è autocreated nel database), quindi non può essere parte della richiesta. Come funziona Agavi mantenere il requisito di idempotence alla luce di questo per la richiesta PUT.

Grazie.

È stato utile?

Soluzione

PUT può essere utilizzato sia per la creazione e per l'aggiornamento dei record completi. POST è di solito utilizzato per gli aggiornamenti parziali e le operazioni correlate, nonché per la creazione di un nuovo tipo di record sul server senza specificare un URL per la risorsa (ad esempio POST / articoli / 23 / commenti restituisce lo stato 201 e una posizione: / articoli / 23 / commenti / 283.136 intestazione). Quindi nel tuo caso (con un ID sequenza / autoincrement), si usa questo approccio.

Tuttavia, HTML (e le forme quindi web) è diverso. Si sa solo GET e POST, non DELETE e PUT. Per le operazioni di cancellazione e di aggiornamento, si sovraccarica il metodo POST.

Ecco perché Agavi, per impostazione predefinita, mappe POST a "scrivere" e arrivare a "leggere" - è il caso d'uso più comune, e "leggere" e "scrivere" sono stati scelti perché sono relativamente neutro e anche in modo rappresentare gli aspetti di sicurezza di GET vs POST (sicurezza come in "GET può essere chiamato senza effetti collaterali" e bla).

È possibile modificare la mappatura dei verbi per l'attuazione AgaviWebRequest in factories.xml; consultare l'utenti Agavi mailing list o il canale IRC, se hai bisogno di aiuto con quella (o chiedere via qui). Un sacco di persone sul canale IRC sono anche abbastanza esperienza con il design schema URL nel caso in cui avete bisogno di più aiuto a rendere il vostro API abbastanza.

Altri suggerimenti

Invece di pensare PUT come creare, pensare ad esso come "mettere". Hai messo una risorsa a un URI (cioè inviare una intera risorsa a un URI).

PUT http://example.com/articles/1

Se si ripete questo (inviare lo stesso intera risorsa per lo stesso URI) si ottiene lo stesso risultato e non hai cambiato la risorsa in quel URI, questo è ciò che lo rende idempotente.

Se l'attuazione di Agavi di PUT è idempotent allora sta attuando PUT correttamente. In caso contrario, non lo è.

PUT può essere utilizzato per creare una risorsa, tranne che se la risorsa esiste già (o è già stato creato da un PUT precedente) sarà solo aggiornarlo. POST non dovrebbe aggiornare le risorse, tuttavia, se questo è semplice CRUD. Si noti che i verbi HTTP non hanno una mappatura definita a determinate azioni necessariamente, dato che sono utili per molto di più di un semplice CRUD.

Si noti inoltre che questa domanda non ha nulla a che fare con il riposo - solo utilizzo corretto HTTP. Quindi, per favore rimuovere il tag REST.

Ho avuto questo problema prima. Questo può essere risolto cambiando il factories.xml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top