2009-01-01 2 views
58

Meine REST-API gibt JSON zurück.Welcher MIME-Typ, wenn JSON von einer REST-API zurückgegeben wird?

Ich gebe gerade Text/Ebene als MIME-Typ zurück, aber es fühlt sich lustig an. Sollte ich application/x-javascript oder einen anderen Typ zurückgeben?

Die zweite Frage bezieht sich auf den HTTP-Statuscode für Fehlerbedingungen. Wenn mein REST API einen Fehlerzustand zurückkehrt, ich als JSON zurückkehre

{ result: "fail", errorcode: 1024, errormesg: "That sucked. Try again!" } 

Sollte der HTTP-Statuscode bleiben bei 200 OK?

+0

Alle Antworten auf diese scheinen anzunehmen, dass ein Browser beteiligt ist. Meine REST-Anwendung sendet und antwortet mit JSON-Nachrichten. Die gesamte Serialisierung und Deserialisierung erfolgt intern durch Client und Server. Third-Party-Browser haben nichts damit zu tun, es ist alles sehr spezifische Maschine zu sehr spezifischen nicht-öffentlichen Maschine. In diesem Fall macht der "application/whatever_type" null Unterschied, es ist alles nur Text. "application/json" bestätigt, dass die Daten json sind, aber nur als Kommentar, und dies ist bereits das allererste, was jeder, der mit der API arbeitet, wissen würde. – mickeyf

Antwort

70

Die JSON Spezifikation schlägt application/json vor, und das scheint von der IETF und IANA Registrierung unterstützt werden.

Bei der zweiten Frage, denke ich, wenn die Behandlung von Nachrichten in irgendeiner Weise fehlschlägt, sollten Sie eine strukturierte und Standardfehlerantwort als JSON-Nachricht zurückgeben; Nur wenn die Nachricht aus irgendeinem Grund nicht an den Back-End-Handler gesendet wird, sollten Sie einen HTTP-Fehlercode in Betracht ziehen.

-Update 2014.06.27: Die Tage, an denen Kunden (Browser) nur mit einer 200-Antwort sind längst vorbei und die vorherrschende Beratung ist für RESTful APIs gearbeitet, um HTTP-Response-Codes geeignet für die Reaktion zu verwenden, 2xx für erfolgreiche Antworten (z. B. 201 für PUT erstellt; 204 kein Inhalt für DELETE) und 4xx und 5xx für alle Fehlerbedingungen, einschließlich derjenigen aus der API selbst.

+0

Danke für den Link zur JSON-Spezifikation. Ich habe eine weitere Stackoverflow-Frage gefunden, die auf einen anderen MIME-Typ "text/x-json" verweist. Nicht sicher, was der Unterschied ist. http://stackoverflow.com/questions/95554/overriding-a-mime-type-in-rails – ashitaka

+6

Aus praktischen Gründen (sagen Sie zum Beispiel haben Sie Flex Horror HTTP-Client in der Mischung), manchmal müssen Sie 200 verwenden für alles. Unter normalen Umständen möchten Sie jedoch den am besten geeigneten HTTP-Statuscode für die Situation verwenden. –

+1

@ashitaka: Diese andere Frage fragt speziell, wie man JSON auf text/x-json setzt. Es gibt keinen Anspruch darauf, dass dies der richtige Medientyp für JSON ist. –

10

Ich bevorzuge es, sowohl mit einem HTTP-Fehlerstatus als auch mit anwendungsspezifischen Nutzdaten zu antworten.

+1

Es scheint, dass David SO verlassen hat, aber kann jemand anderes obige Aussage unterstützen und einige Argumente bringen, warum dies eine gute (oder schlechte) Übung ist? Laut der obigen Antwort von Software Monkey sehe ich, dass die Rückgabe eines HTTP-Fehlers mit einer gültigen JSON-Antwort eine falsche Idee ist. Der Server sollte nur einen HTTP-Fehler zurücksenden, wenn ein echter Fehler vorliegt. – trejder

10

Nein, Sie sollten 200 in einem Fehlerzustand nicht zurückgeben.

Es ist in Ordnung, den Statuscode zu wiederholen oder einen detaillierteren Fehlercode in die Antwortnutzlast einzufügen.

6

Die richtige Content-type zurückgeben ist application/json, nach RFC 4627, die auch den MIME-Typ IANA registriert (und tatsächlich, es zeigt sich auf IANA-Seite). Natürlich, wenn Sie einen Kunden schreiben, möchten Sie liberaler sein, was Sie akzeptieren, und auch andere wie text/json und text/x-json akzeptieren.

Jetzt, wenn es einen Fehler gibt, sollten Sie nicht HTTP 200 zurückgeben, das ist grundsätzlich nicht RESTful. Ich weiß, dass es manchmal keine exakte Übereinstimmung für Ihren Fehler gibt, aber wählen Sie die nächsten Fehler 4XX (Fehler des Clients) oder 5XX (Fehler des Servers) in RFC 2616 Sections 10.4 -10.5 und genauer im JSON.

0

Wenn Sie mit "REST-API" meinen, dass Sie einer REST-Architektur folgen möchten, wird der zu verwendende Medientyp von der Funktionalität bestimmt, die Sie über die REST-API bereitstellen möchten. Möchten Sie neue Objekte erstellen können? Abfrage einer Liste von Objekten? Ein Objekt bearbeiten? Wenn dies der Fall ist, könnte ein guter zu verwendender RESTful-Medientyp vnd.collection + json sein, weil er eine hypertextverknüpfte Schnittstelle definiert, um eine Sammlung von json-Objekten zu manipulieren.

Hinweis: Eine RESTful-API könnte den Medientyp application/json verwenden, aber dieser Medientyp hat keine Hypertext-verknüpfte RESTful-Schnittstelle, daher wäre es ein Endpunkt der Statusänderung. Es ist auch völlig akzeptabel, einer Web-API-Architektur zu folgen, in der HTTP-RPC-Aufrufe Anwendungs-/JSON-Objekte zurückgeben und andere HTTP-RPC-Aufrufe diese Objekte manipulieren und es keine Hypertext-Link-Schnittstelle für die Verwendung und Navigation der Statusänderungen gibt. Aber das ist nicht REST.

Ich mag diese Beschreibung von REST (vom Schöpfer des REST):

REST APIS must be hypertext driven

Mit anderen Worten, wenn der Motor des Anwendungszustand (und damit die API) nicht angetrieben wird per Hypertext, dann kann es nicht RESTful sein und kann nicht eine REST API sein. Zeitraum.

Auch aus der Diskussion dieser Beitrag ist dieses Beispiel für eine RESTful Anwendung: Lost Boys's Spam-E REST Application

Verwandte Themen