2011-11-15 18 views
26

Voglio implementare gli aggiornamenti parziali per la mia risorsa in quanto ho una grande risorsa e voglio aggiornare le informazioni parziali da essa. Ho seguito i seguenti link ma non
per capire se utilizzare i metodi HTTP POST o PATCH.Come supportare gli aggiornamenti parziali (PATCH) in REST

HTTP MODIFY verb for REST?

How to submit RESTful partial updates?

http://jacobian.org/writing/rest-worst-practices/

https://github.com/archiloque/rest-client/issues/79

http://tools.ietf.org/html/draft-dusseault-http-patch-16

http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-06.html

http://jasonsirota.com/rest-partial-updates-use-post-put-or-patch

http://bitworking.org/news/296/How-To-Do-RESTful-Partial-Updates

https://github.com/dharmafly/jsonpatch.js

Per qualsiasi proposta valida soluzione per questo.

+0

@prashanath U Got qualsiasi soluzione – CoronaPintu

risposta

90

Secondo RFC5789 (http://tools.ietf.org/html/rfc5789), questo è esattamente ciò che è PATCH per:

Diverse applicazioni alla proroga del protocollo Hypertext Transfer (HTTP) richiedono una funzionalità per eseguire una modifica parziale delle risorse. Il metodo PUT HTTP consente solo la sostituzione completa di un documento. Questa proposta aggiunge un nuovo metodo HTTP, PATCH, per modificare una risorsa HTTP esistente.

La distinzione tra PATCH e PUT è descritto come:

La differenza tra i PUT e patch richieste si riflette nel modo il server elabora l'entità allegata per modificare la risorsa identificata dal richiesta-URI. In una richiesta PUT, l'entità inclusa è considerata una versione modificata della risorsa memorizzata sul server di origine e il client richiede che la versione memorizzata venga sostituita. Con PATCH, tuttavia, l'entità inclusa contiene un set di istruzioni che descrivono come una risorsa che attualmente risiede sul server di origine deve essere modificata per produrre una nuova versione.Sono anche descritti

Le limitazioni di POST:

Il metodo PUT è già definito per sovrascrivere una risorsa con un nuovo corpo completo, e non può essere riutilizzato per fare modifiche parziali. In caso contrario, proxy e cache, e persino client e server, potrebbero ottenere confuso sul risultato dell'operazione. POST è già in uso, ma senza ampia interoperabilità (per uno, non esiste un modo standard per scoprire supporto per il formato di patch) [...]

vorrei suggerire di leggere la RFC e rendere la vostra propria mente, ma a me sembra abbastanza chiaro - le richieste PATCH dovrebbero essere elaborate come aggiornamenti parziali. (NB non sono idempotente, a differenza di PUT.)

EDIT: come ha sottolineato Eugene nei commenti, anche se le richieste di patch vengono "neither safe nor idempotent as defined by [RFC2616]", possono essere realizzati in modo da:

Una richiesta patch può essere rilasciato in modo tale da essere idempotente, , che aiuta anche a prevenire i cattivi risultati dalle collisioni tra due richieste di PATOLOGIA sulla stessa risorsa in un intervallo di tempo simile. Le collisioni da più richieste PATCH possono essere più pericolose delle collisioni PUT perché alcuni formati di patch devono operare da un punto base noto altrimenti corromperanno la risorsa. Client utilizzando questo tipo di applicazione di patch DOVREBBE utilizzare una richiesta condizionale tale che la richiesta avrà esito negativo se la risorsa è stata aggiornata poiché l'ultimo accesso al client della risorsa. Ad esempio, il client può utilizzare un forte ETag [RFC2616] in un'intestazione If-Match sulla richiesta PATCH .

+20

+1 Potrei aggiungere che 'PATCH' può essere reso ** idempotent ** includendo il' If-Match 'header, come descritto nella RFC a cui ti riferisci. In realtà è fortemente suggerito nella RFC di farlo, poiché l'applicazione di patch alla versione sbagliata può rovinare un riferimento, in contrasto con un PUT che sostituisce semplicemente l'intera cosa. –

+0

Vero - anche se per far funzionare tutto questo dovresti anche generare/utilizzare correttamente gli ETags. –

+0

Quale è una buona idea in molti casi, ad esempio per la memorizzazione nella cache, ma in particolare per gli aggiornamenti parziali, in cui si desidera assicurarsi che si stia applicando una versione specifica della risorsa. A volte le informazioni contestuali possono essere incorporate nel diff, ma gli ETags sono un modo indipendente dal formato diff, che è spesso facile da integrare in framework generici che non sanno nulla di particolari formati diff. –

-17

PATCH deve essere utilizzato con un formato patch, solo per il patching a livello di documento (noto anche come diff sulla rappresentazione effettiva). Il suo uso per altri scopi è dubbio e discutibile, e non è chiaro che il metodo sia stato progettato per usi di tipo non multimediale.

In generale, un POST rappresenta l'approccio corretto, ma è preferibile dividere la risorsa in più risorse e modificarla.

[Modificato per chiarezza, come alcuni non leggono commenti]

+6

non lo faccio vedere i requisiti * di * prashanth *: 'aggiornamenti parziali per la mia risorsa' sarebbero in conflitto con ciò che si suppone che PATCH faccia:' entity contiene una serie di istruzioni che descrivono come una risorsa attualmente residente sul server di origine dovrebbe essere modificata per produrre una nuova versione . 'Questo è da ** rfc5789 **, ma il vecchio ** rfc2068 ** è simile. Anche per quanto riguarda il 'diff sui byte effettivi', non è possibile ottenere questo confuso con gli intervalli HTTP dove gli implementatori sono richiesti solo per implementare intervalli di byte (ma questo può essere esteso ad altre unità)? –

+1

Non confuso le richieste di intervallo http con i documenti patch, no, grazie per sottolineare l'eventuale confusione per i lettori. Le specifiche in questione sono abbastanza chiare su un documento patch che è un documento che modifica lo stato di una risorsa, meno chiaro su come applicare tale documento, lasciando la scelta a te. Dal punto di vista delle specifiche, è incoraggiato a fare condizionali, e gli esempi di forte impatto sono riportati nell'esempio, che sappiamo essere specifici delle rappresentazioni. I formati diff conosciuti o pubblicati (che useresti in ReST) sono specifici del documento, quindi la mia risposta. – SerialSeb

+3

In generale una richiesta POST viene utilizzata per creare risorse, non aggiornarle. – ChrisV

0

È necessario utilizzare il metodo PATCH come descritto in RFC-7386 "JSON merge PATCH".

E.g. se si desidera modificare il valore di "a" e la rimozione di "f" in risorsa come:

{ 
    "a": "b", 
    "c": { 
     "d": "e", 
     "f": "g" 
    } 
    } 

È possibile raggiungere questo obiettivo con l'invio:

 PATCH /target HTTP/1.1 
     Host: example.org 
     Content-Type: application/merge-patch+json 

     { 
     "a":"z", 
     "c": { 
      "f": null 
     } 
     } 
Problemi correlati