Immer einzelne Objekte in einem Array für JSON-Nutzdaten der REST-API zurückgeben?


8

Für eine REST-API, an der ich arbeite, möchte ich JSON in einem konsistenten Layout zurückgeben:

{
  "Data" : {
     "Id" : 123,
     "Email" : "charlie@somewhere.com"
     "Firstname" : "Charlie",
     "Surname" : "Brown",
 },
 "Error" : null
}

Die Nutzdaten enthalten immer "Daten" und "Fehler", wobei der eine oder andere null sein kann.

Meine Frage bezieht sich auf "Daten" und Endpunkte, die immer nur ein Objekt zurückgeben. Angenommen, ich habe eine API users/current, die den aktuell authentifizierten Benutzer zurückgibt. Ich hätte diesen Benutzer wie oben gezeigt zurückgegeben. ein einzelnes JSON-Objekt mit dem Namen "Data".

Für Endpunkte, die null, ein oder mehrere Objekte zurückgeben könnten, würde ich (natürlich) "Daten" zu einem Array machen:

{
  "Data" : [
    {
      (first object)
    },
    {
      (second object)
    }
  ],
  "Error" : null
}

Ich habe den Standpunkt gehört, dass "Daten" aus Gründen der Konsistenz immer ein Array sein sollten. Selbst wenn ein Endpunkt logischerweise immer nur ein einzelnes Objekt (oder null) zurückgeben würde.

Was denken andere? Ich denke, dass es nicht notwendig ist, "Daten" und ein Array zu erstellen, wenn nie mehr als ein Objekt zurückgegeben wird.


Ich würde denken, wenn es einen Fehler gäbe, würden Sie einen geeigneten 400- oder 500-Code zurückgeben und alle Details im Inhalt senden. Die Rückgabe eines Datenabschnitts erscheint seltsam und möglicherweise verwirrend, insbesondere wenn in Ihrem Beispiel Daten UND Fehler festgelegt sind.
Andy

Antworten:


9

Ich denke, diese Art von Konsistenz ist falsch.

Das Einschließen der Daten in ein Array ist für einen API-Konsumenten unwahrscheinlich, da er immer noch wissen muss, wie die tatsächlichen Daten zu interpretieren sind. Zum Beispiel ist es einfach nicht wahrscheinlich, dass die "Daten" aus demselben Code resultieren /users/currentund /cities/chicago/restaurantsvon diesem verarbeitet werden.

Für Fehler, auf der anderen Seite, es ist wahrscheinlich , dass alle Fehler , die von dem gleichen Fehlerbehandlung Code verarbeitet werden, und dann gibt es einen Vorteil , die gleiche Struktur zu verwenden.

Fragen Sie sich Folgendes: Wenn dies eine Klasse in Ihrer bevorzugten OOP-Sprache wäre, würden Sie dafür sorgen, dass alle Methoden aus Konsistenzgründen denselben Typ zurückgeben?


Ich neige auch dazu. Wie Sie in Ihrem letzten Punkt sagen, würde ich eine Klasseneigenschaft, die (sagen wir) ein Benutzerobjekt ist, nicht zu einer Array-Eigenschaft machen, um eine gewisse Konsistenz zu gewährleisten.
Diego Barros

Wie unterscheiden Sie zwischen /users/currentund dem Benutzer, dessen ID (möglicherweise Anmeldename) "aktuell" ist?
TrueWill

1

Wenn die empfangende Seite einen allgemeinen Empfänger für Ihre JSON-Nachrichten benötigt, kann es hilfreich sein, wenn der Datenknoten dasselbe Format hat. In diesem Fall ist es also nützlich, immer ein Array zu haben, damit es jedes Mal auf die gleiche Weise analysiert werden kann.

Wenn jede Antwort behandelt wird individuell werden (andere API - Aufrufe von verschiedenen Methoden), kann ich Ihren Punkt sehen, jedoch sollte es absolut klar sein (von den API - Aufrufen) , wenn ein Array oder ein Objekt zurückgegeben werden soll.


Ihr Standpunkt, dass es im selben Format vorliegt und daher jedes Mal auf die gleiche Weise analysiert wird, ist absolut sinnvoll.
Diego Barros

Die von mir verwendete Bibliothek analysiert jedoch den JSON für mich und behandelt, ob der JSON ein Array oder ein einzelnes Objekt ist.
Diego Barros

Dann muss der Code, der das von Ihrer Bibliothek zurückgegebene Objekt verwendet, wissen, ob das Ergebnis ein Array oder ein einzelnes Objekt ist.
Geerten

Ich verwende RestKit, das den entsprechenden Delegaten-Rückruf aufruft, je nachdem, ob es sich um ein Array oder ein einzelnes Objekt handelt: - (void) objectLoader: (RKObjectLoader *) objectLoader didLoadObjects: (NSArray *) Objekte oder - (void) objectLoader: (RKObjectLoader * ) objectLoader didLoadObjects: (id) Objekt. Welches ist eine schöne Art, es zu tun.
Diego Barros

Das ist in der Tat eine schöne Art, aber nicht jeder könnte eine so schöne, raffinierte Art verwenden.
Geerten

1

Ich bin kein Fan des Array-Ansatzes, da er keine echte Konsistenz bietet. Er zwingt den Benutzer des Dienstes, sich entweder über Dinge wie die Frage zu informieren, was passiert, wenn sich mehr als ein Objekt in diesem Array befindet, oder die Umhüllung zu entfernen Array so schnell wie möglich für diese Singleton-Arrays. Sie müssten noch zwei verschiedene Dinge tun.

Wenn Sie das Array verwenden, stellen Sie jedoch sicher, dass Data niemals null ist. Wenn keine Daten vorhanden sind, sollte das Array leer sein. Das ist der einzige Vorteil, den ich sehen kann.


-1

Ich bin auf der Seite, immer ein Array zurückzugeben. Auf der Clientseite verwende ich mein Antwortobjekt "Benutzer", unabhängig davon, ob alle Benutzer oder nur einer abgerufen werden. Wenn Sie einen Endpunkt haben, der Arrays zurückgibt, und einen anderen, der dasselbe Objekt zurückgibt, jedoch nie mehr als eines, verwenden Sie immer noch ein Array.

Es gibt ähnliche Argumente für die Verwendung derselben Logik auf der Serverseite. Verwenden Sie einfach denselben Code, unabhängig davon, ob Ihre Abfrage ein oder mehrere Elemente zurückgibt.

Die einzige Ausnahme wäre, wenn ein Objekt zurückgegeben wird, das in keinem Kontext als Array existiert, dann besteht keine Notwendigkeit.


Für mich repräsentiert der JSON ein Objekt (das es ist). Wenn ich also Klassen erstellen würde (in Ihrer bevorzugten Programmiersprache) - sagen wir, ich hätte eine Login-Klasse mit einer CurrentUser-Eigenschaft -, würde ich diese Eigenschaft nicht zu einem Array machen, das ein einzelnes Benutzerobjekt enthält. Ich würde den aktuellen Benutzer mit Login.CurrentUser und nicht mit Login.CurrentUser [0] erhalten. Müsste ich nicht nur nach einer Null-CurrentUser-Eigenschaft suchen, sondern auch die Länge des Arrays?
Diego Barros
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.