2016-12-01 4 views
0

aktualisieren Es ist dies MongoBean: SuperBeanTeilfelder REST API

class SuperBean extends MongoBaseBean{ 
    private String id; 
    private String title; 
    private String parent; 

    //And getters, setters 
} 

benötigen, ist ein Update-API zu schreiben, die zum Durchführen Teilattribute Aktualisierung der Lage ist. Ein gängiger Ansatz, der sowohl im Web als auch von meinen Kollegen zu hören ist, besteht darin, die Felder in der Anfrage auf Null zu prüfen und update, wenn nicht null. Was aber, wenn die Aktualisierungsanforderung für den Wert lautet, der auf Null aktualisiert werden soll?

Nach einigen Diskussionen kamen wir mit drei Ansätzen bis:

  • Set Standardwert für das Feld in der Bohne. Daher wird dies anstelle eines Nicht-Null-Elternfeldes, wenn es $ in der Anfrage nicht enthält, für die Aktualisierung in Betracht gezogen.

    class SuperBean extends MongoBaseBean{ 
    private String id; 
    private String title; 
    private String parent = "$"; 
    
    //And getters, setters 
    } 
    
  • Lassen Sie die Aktualisierung API-Implementierung eine Karte akzeptieren. Die tatsächliche Bean wird abgerufen und alle Felder, die in der Anforderungszuordnung vorhanden sind, werden aktualisiert.

    @Post 
    public SuperBean updatePartial(Map<String,Object> dataObject) {} 
    
  • Lassen Sie die Update-API DTO akzeptieren, die 2 Karten enthält. Eine für alte Werte, andere für neue Werte. Dies kann in Szenarios von Vorteil sein, in denen das Update nur durchgeführt werden muss, wenn die Datenbank die Werte enthält, die in oldDataObj gesendet wurden. Dies erhöht jedoch die Nutzlastgröße.

    class SuperBeanUpdateDTO { 
        private Map<String, Object> oldDataObj; 
        private Map<String, Object> newDataObject; 
        //getters, setters 
        } 
    
        @Post 
        public SuperBean updatePartial(SuperBeanUpdateDTO updateDTO) {} 
    

Welche Faktoren sollten eine dieser Ansätze in Betracht gezogen werden, um zu wählen? Gibt es einen anderen besseren Weg, dieses Problem anzugehen?

Antwort

1

In meinen Projekten wählen wir normalerweise die Art, die ähnlich mit Ihrem zweiten Weg ist. aber nicht genau dasselbe.

zum Beispiel in der Client-Seite, haben Sie eine Seite oder einen Blick Ihre Profildaten zu ändern, umfasst name, birthday, gender, obwohl Sie nur den name Wert ändern, wenn Sie save Schaltfläche klicken, wird es noch senden Die Daten zum Server enthalten birthday und gender mit name Feld, aber behalten Sie ihren Wert als alt. Die Server-API aktualisiert diese drei Werte direkt in der Datenbank und prüft nicht, ob sich ihr Wert geändert hat oder nicht.

Wenn Sie eine andere Seite oder eine andere Ansicht haben, um andere Teile des Profils zu ändern, likes password, müssen Sie eine neue Methode im Client und eine neue API im Server hinzufügen. Die API-URL liked PATCH /reset_password, und die gesendeten Daten sollten old_password und new_password Feld enthalten.

PS:
1. verwenden wir PUT oder PATCH eine Ressource zu aktualisieren, nicht POST wird POST verwendet, um eine neue Ressource zu erstellen. 2. Wenn Sie eine Ressource aktualisieren, im obigen Beispiel, liked die API PATCH /profiles/:id (Profil des anderen) oder PATCH /profile (Sie Profil), so dass die gesendeten Daten nicht mehr id Feld, es in Ihrer API URL enthält.