Für das, was es wert ist, mache ich das anders. Ein erfolgreicher Aufruf enthält nur die JSON-Objekte. Ich benötige kein übergeordnetes JSON-Objekt, das ein Erfolgsfeld enthält, das true angibt, und ein Nutzdatenfeld, das das JSON-Objekt enthält. Ich gebe nur das entsprechende JSON-Objekt mit einer 200 zurück oder was auch immer im Bereich 200 für den HTTP-Status im Header geeignet ist.
Wenn jedoch ein Fehler auftritt (etwas in der 400er-Familie), gebe ich ein wohlgeformtes JSON-Fehlerobjekt zurück. Wenn der Client beispielsweise einen Benutzer mit einer E-Mail-Adresse und einer Telefonnummer postet und eine davon fehlerhaft ist (dh ich kann sie nicht in meine zugrunde liegende Datenbank einfügen), gebe ich Folgendes zurück:
{
"description" : "Validation Failed"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Invalid phone number."
} ],
}
Wichtige Punkte hierbei sind, dass die Eigenschaft "field" genau mit dem JSON-Feld übereinstimmen muss, das nicht validiert werden konnte. Auf diese Weise können Kunden genau wissen, was bei ihrer Anfrage schief gelaufen ist. Außerdem befindet sich "Nachricht" im Gebietsschema der Anforderung. Wenn sowohl "emailAddress" als auch "phoneNumber" ungültig wären, würde das Array "Errors" Einträge für beide enthalten. Ein 409 (Conflict) JSON-Antworttext könnte folgendermaßen aussehen:
{
"description" : "Already Exists"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Phone number already exists for another user."
} ],
}
Mit dem HTTP-Statuscode und diesem JSON verfügt der Client über alles, was er benötigt, um deterministisch auf Fehler zu reagieren, und es wird kein neuer Fehlerstandard erstellt, der versucht, die HTTP-Statuscodes vollständig zu ersetzen. Beachten Sie, dass diese nur für den Bereich von 400 Fehlern auftreten. Für alles im Bereich 200 kann ich einfach alles zurückgeben, was angemessen ist. Für mich ist es oft ein HAL-ähnliches JSON-Objekt, aber das spielt hier keine Rolle.
Das einzige, was ich über das Hinzufügen nachgedacht habe, war ein numerischer Fehlercode, entweder in den Array-Einträgen "Fehler" oder im Stammverzeichnis des JSON-Objekts. Aber bisher haben wir es nicht gebraucht.