6 Pytanie: Jaki typ MIME jest zwracany przez JSON przez API REST?

pytanie utworzone w Sat, May 11, 2013 12:00 AM

Mój interfejs REST API zwraca JSON.

Obecnie zwracam tekst /zwykły tekst jako typ MIME, ale jest to śmieszne. Czy powinienem zwrócić application/x-javascript lub inny typ?

Drugie pytanie dotyczy kodu statusu HTTP w przypadku błędów. Jeśli mój REST API zwraca stan błędu, zwracam jako JSON

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

Czy kod statusu HTTP powinien pozostać na poziomie 200 OK?

    
66
  1. Wszystkie odpowiedzi na to wydają się zakładać, że przeglądarka jest zaangażowana. Moja aplikacja REST wysyła i odpowiada komunikatami json. Cała serializacja i de-serializacja jest wykonywana wewnętrznie przez klienta i serwer. Przeglądarki innych firm nie mają nic wspólnego z żadnym z nich, są to bardzo specyficzne maszyny do bardzo specyficznych maszyn niepublicznych. W tym przypadku „application /whatever_type” robi różnicę zero, to tylko tekst. „application /json” potwierdza, że ​​dane są json, ale tylko jako komentarz, a to już pierwsza rzecz, o której wiedziałby każdy, kto pracuje z interfejsem API.
    2017-02-08 15: 32: 03Z
  2. @ mickeyf - Fakt, że przeglądarki obsługują protokół HTTP nie oznacza, że ​​aplikacje M2M nie powinny. Jeśli chcesz napisać aplikację, która nie obsługuje nagłówków Accept i Content-Type ( tools.ietf.org/html/rfc7231#section-3.1.1.5 ) możesz to zrobić, ale inni programiści M2M mogą chcieć obsługiwać wiele typów mediów (np. aplikacji /cbor) w standardzie sposób.
    2018-06-25 21: 08: 32Z
6 odpowiedzi                              6                         

Specyfikacja JSON sugeruje application/json, co wydaje się być obsługiwane przez IETF i rejestr IANA .

W drugim pytaniu myślę, że jeśli obsługa komunikatów zawiedzie w jakiś sposób, powinieneś zwrócić strukturalną i standardową odpowiedź na błąd jako komunikat JSON; tylko wtedy, gdy z jakiegoś powodu nie uda się dostarczyć wiadomości do obsługi zaplecza, należy rozważyć kod błędu HTTP.

Aktualizacja 2014-06-27 : czasy, w których klienci (przeglądarki) działały tylko z odpowiedzią 200, już dawno minęły, a dominującą radą dla API RESTful jest użycie kodów odpowiedzi HTTP odpowiednich dla odpowiedzi , 2xx dla udanych odpowiedzi (np. 201 Created for PUT; 204 No Content for DELETE) oraz 4xx i 5xx dla wszystkich warunków błędu, w tym tych z samego API.

    
77
2014-06-27 20: 57: 10Z
  1. Dziękujemy za link do specyfikacji JSON. Znalazłem inne pytanie dotyczące przepływu stosu, które wskazuje na inny typ MIME „text /x-json”. Nie jestem pewien, jaka jest różnica. stackoverflow.com/questions/95554/…
    2009-01-01 03: 38: 57Z
  2. Ze względów praktycznych (powiedzmy na przykład, że w miksie jest przerażający klient HTTP Flexa), czasami trzeba użyć 200 za wszystko. Jednak w normalnych okolicznościach chcesz użyć najbardziej odpowiedniego kodu stanu HTTP dla danej sytuacji.
    2009-10-31 05: 08: 24Z
  3. @ ashitaka: To inne pytanie wyraźnie pyta, jak ustawić JSON na text /x-json. Nie ma prawa twierdzić, że jest to właściwy typ mediów dla JSON.
    2011-05-25 18: 50: 17Z
19
2011-05-25 08: 39: 06Z

Wolę odpowiadać zarówno statusem błędu HTTP, jak i ładunkiem specyficznym dla aplikacji.

    
10
2009-05-31 18: 13: 35Z
  1. Wydaje się, że David opuścił SO, ale czy ktokolwiek inny może poprzeć powyższe stwierdzenie i przynieść kilka argumentów, dlaczego jest to dobra (lub zła) praktyka? Jak wynika z odpowiedzi Software Monkey na powyższe, widzę, że zwrot błędu HTTP z poprawną odpowiedzią JSON to zły pomysł. Serwer powinien odesłać tylko błąd HTTP, jeśli wystąpi prawdziwy błąd.
    2013-12-18 10: 00: 01Z

Nie, nie powinieneś zwrócić 200 w stanie błędu.

Można powtórzyć kod statusu lub dołączyć bardziej szczegółowy kod błędu w ładunku odpowiedzi.

    
10
2011-05-25 09: 25: 03Z

Odpowiedni Content-type do zwrotu to application/json, zgodnie z RFC 4627 , który również rejestruje MIME wpisz IANA (i rzeczywiście, pojawia się na stronie IANA). Oczywiście, jeśli miałbyś napisać klienta, chciałbyś być bardziej liberalny w tym, co akceptujesz, a także akceptować innych, takich jak text/json i text/x-json.

Jeśli wystąpił błąd, nie powinieneś zwracać HTTP 200, który zasadniczo nie jest RESTful. Wiem, że czasami nie ma dokładnego dopasowania do twojego błędu, ale wybierz najbliższy błąd 4XX (błąd klienta) lub 5XX (błąd serwera) w RFC 2616 Sekcje 10.4 -10.5 i dokładniej w JSON.

    
6
2011-08-01 19: 15: 24Z

Jeśli przez „REST API” masz na myśli, że chcesz podążać za architekturą REST, to typ używanego nośnika zależy od funkcji, którą chcesz ujawnić za pośrednictwem interfejsu API REST. Czy chcesz móc tworzyć nowe obiekty? Zapytanie o listę obiektów? Edytuj obiekt? Jeśli tak, dobrym typem nośnika RESTful może być vnd.collection + json, ponieważ definiuje on interfejs połączony hipertekstem do manipulowania kolekcją obiektów json.

Uwaga: API RESTful może używać aplikacji typu media /json, ale ten typ nośnika nie ma interfejsu RESTful z hipertekstem, więc byłby to punkt końcowy zmiany stanu.

Dopuszczalne jest również stosowanie architektury API WWW, w której wywołania HTTP RPC zwracają aplikacje /obiekty json, a inne wywołania HTTP RPC manipulują tymi obiektami i nie ma interfejsu łącza hipertekstowego do używania i nawigacji po zmianach stanu. Ale to nie jest REST.

Podoba mi się ten opis REST (od twórcy REST):

APEST REST musi być sterowany hipertekstem

  

Innymi słowy, jeśli silnik stanu aplikacji (a tym samym API)   nie jest napędzany przez hipertekst, wtedy nie może być PRZYPADKOWY i nie może   być API REST. Okres.

Z tego posta wynika również przykład aplikacji RESTful: Zagubiony Aplikacja REST dla chłopców Spam-E

    
1
2018-03-06 04: 35: 35Z
źródło umieszczone tutaj