Przez jakiś czas bawiłem się w JSON , wypychając go jako tekst i nikomu nie zaszkodzi (o czym wiem), ale chciałbym zacząć robić wszystko poprawnie.
Widziałem tak wiele rzekomych „standardów” dla typu zawartości JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Ale który z nich jest poprawny, czy najlepszy? Rozumiem, że występują różne problemy związane z bezpieczeństwem i obsługą przeglądarki.
Wiem, że istnieje podobne pytanie, jaki typ MIME, jeśli JSON jest zwracany przez interfejs API REST? , ale chciałbym nieco bardziej ukierunkowaną odpowiedź.
IANA zarejestrowała oficjalny typ MIME dla JSON as
application/json
.Zapytany o to, dlaczego nie
text/json
, Crockford powiedział, że JSON nie jest tak naprawdę JavaScript ani tekstem, a także IANA była bardziej skłonna do rozdaniaapplication/*
niżtext/*
.Więcej zasobów:
źródło
text/*
sekcji na początku, które prawdopodobnie zostałyby umieszczone wapplication/*
sekcji w tych dniach.cat file.jpg
na przykład. Natomiast każdy plik xml lub json można w 100% wydrukować. Myślę więc, że punkt Stijn de Witt jest słuszny, mimo że tak, jest już za późno na zmianę.x
litery. Nie 78. JSON jest tekstem dokładnie w taki sam sposób jak HTML (text / html). Zawiera tylko czytelne znaki tekstowe z ustrukturyzowanym znaczeniem.W przypadku JSON:
W przypadku JSON-P :
źródło
Oczywiście poprawnym typem nośnika MIME dla JSON jest
application/json
, ale należy zdać sobie sprawę, jakiego rodzaju danych oczekuje się w Twojej aplikacji.Na przykład używam Ext GWT i odpowiedź serwera musi iść jako text / html, ale zawiera dane JSON.
Po stronie klienta, moduł nasłuchujący Ext GWT
W przypadku użycia typu odpowiedzi aplikacji / json przeglądarka sugeruje mi zapisanie pliku.
Fragment kodu źródłowego po stronie serwera przy użyciu Spring MVC
źródło
JSON:
Odpowiedź to dane generowane dynamicznie, zgodnie z parametrami zapytania przekazanymi w adresie URL.
Przykład:
Typ zawartości:
application/json
JSON-P:
JSON z wyściółką. Odpowiedź to dane JSON, z zawiniętym wywołaniem funkcji.
Przykład:
Typ zawartości:
application/javascript
źródło
Jeśli używasz Ubuntu lub Debiana i serwujesz pliki .json za pośrednictwem Apache, możesz chcieć podawać pliki z poprawnym typem zawartości. Robię to przede wszystkim dlatego, że chcę korzystać z rozszerzenia Firefox JSONView
Moduł Apache mod_mime pomoże to zrobić łatwo. Jednak w Ubuntu musisz edytować plik /etc/mime.types i dodać linię
Następnie uruchom ponownie Apache:
źródło
Jeśli dzwonisz do ASP.NET Web Services po stronie klienta, musisz użyć
application/json
tej funkcji, aby działała. Wierzę, że to samo dotyczy frameworków jQuery i Ext .źródło
content-Type: text/plain
,content-Type: application/json
,content-Type: application/json; charset=UTF-8
,contentType: "application/x-www-form-urlencoded; charset=UTF-8"
Właściwym typem zawartości dla JSON jest
application/json
JEŚLI używasz JSONP , znanego również jako JSON z Padding, który w rzeczywistości jest JavaScript, a więc właściwym typem treści byłbyapplication/javascript
.źródło
Nie ma wątpliwości, że
application/json
jest to najlepszy typ MIME dla odpowiedzi JSON.Ale miałem pewne doświadczenie, z którego musiałem korzystać z
application/x-javascript
powodu problemów z kompresją. Moje środowisko hostingowe to hosting współdzielony z GoDaddy . Nie pozwalają mi zmieniać konfiguracji serwera. Do mojegoweb.config
pliku dodałem następujący kod do kompresji odpowiedzi.Dzięki temu strony .aspx zostały skompresowane za pomocą g-zip, ale odpowiedzi JSON nie. dodałem
w sekcjach typów statycznych i dynamicznych. Ale to wcale nie kompresuje odpowiedzi JSON.
Następnie usunąłem ten nowo dodany typ i dodałem
zarówno w sekcjach typów statycznych, jak i dynamicznych, i zmieniono typ odpowiedzi w
.ashx (program obsługi asynchronicznej) do
A teraz odkryłem, że moje odpowiedzi JSON zostały skompresowane za pomocą g-zip. Więc osobiście polecam używać
tylko jeśli chcesz skompresować swoje odpowiedzi JSON we współdzielonym środowisku hostingowym . Ponieważ w hostingu współdzielonym nie pozwalają one zmieniać konfiguracji IIS .
źródło
application/json
, I wykorzystać go na moim dzielonego hostingu i nie będę sugerować przy użyciu innego typu zawartości włączyć kompresję w każdym razie, to jest po prostu błędne. Można to zrobić, ale nadal będzie źle. Używanie różnych typów treści do obsługi przeglądarki to jedno, a używanie różnych typów treści do kompresji po stronie serwera to inna sprawa.Tylko przy użyciu
application/json
jako typu MIME mam następujące informacje (od listopada 2011 r. Z najnowszymi wersjami Chrome, Firefox z Firebug ):źródło
Nie wszystko działa dla typu zawartości
application/json
.Jeśli korzystasz z formularza przesyłania JS Ext do przesłania pliku, pamiętaj, że przeglądarka analizuje odpowiedź serwera, aby utworzyć dokument dla
<iframe>
.Jeśli serwer używa JSON do wysłania obiektu zwracanego,
Content-Type
nagłówek musi być ustawiony natext/html
, aby nakazać przeglądarce wstawienie tekstu bez zmian w treści dokumentu.Zobacz dokumentację interfejsu API Ext JS 3.4.0 .
źródło
application/json
według specyfikacji.iframe
wydaje się ogniaload
imprezy naapplication/javascript
,application/x-javascript
,text/javascript
,text/plain
, ale NIE wypalania goapplication/json
anitext/html
. Na dzień dzisiejszy Android <= 2.3 stanowi około 50% udziału w rynku Androida.JSON jest język dziedzinowy (DSL) oraz niezależne format danych JavaScriptu, i jako taki posiada własny MIME typu,
application/json
. Szacunek dla typów MIME jest oczywiście oparty na kliencie, podobnietext/plain
może być w przypadku przesyłania bajtów, ale wtedy niepotrzebnie popychasz interpretację do domeny aplikacji dostawcy -application/json
. Czy przesłałbyś XML przeztext/plain
?Ale szczerze mówiąc, twój wybór typu MIME jest wskazówką dla klienta, jak interpretować dane -
text/plain
lubtext/HTML
(gdy nie jest HTML) jest jak usuwanie typu - jest tak nieinformacyjny, jak uczynienie wszystkich twoich obiektów typu Object w języku pisanym na maszynie.Żadne środowisko uruchomieniowe przeglądarki, o którym wiem, nie pobierze dokumentu JSON i automatycznie udostępni go środowisku wykonawczemu jako obiekt dostępny w JavaScript bez interwencji, ale jeśli pracujesz z kalekim klientem, to zupełnie inna sprawa. Ale to nie jest cała historia - usługi RESTful JSON często nie mają środowiska wykonawczego JavaScript, ale nie powstrzymuje ich to przed użyciem JSON jako realnego formatu wymiany danych. Jeśli klienci są tak sparaliżowani ... rozważałbym może zastrzyk HTML za pośrednictwem usługi szablonów Ajax .
Aplikacja / JSON!
źródło
Jeśli pracujesz w środowisku klienta, sprawdzenie dobrze obsługiwanej aplikacji internetowej jest obowiązkowe.
Właściwy typ treści HTTP byłby
application/json
, jak już inni podkreśleni, ale niektórzy klienci nie radzą sobie z tym dobrze, dlatego jQuery zaleca ustawienie domyślnetext/html
.źródło
Poprawna odpowiedź to:
źródło
Jak wielu innych wspomniało,
application/json
to poprawna odpowiedź.Ale to, co jeszcze nie zostało wyjaśnione, oznacza inne proponowane opcje.
application/x-javascript
: Eksperymentalny typ MIME dla JavaScript wcześniejapplication/javascript
stał się standardem.text/javascript
: Teraz nieaktualne. Powinieneś używaćapplication/javascript
podczas używania javascript.text/x-javascript
: Eksperymentalny typ MIME dla powyższej sytuacji.text/x-json
: Eksperymentalny typ MIME dla JSON przedapplication/json
oficjalną rejestracją.Podsumowując, za każdym razem, gdy masz jakiekolwiek wątpliwości dotyczące typów treści, powinieneś sprawdzić ten link
źródło
text/javascript
stał się przestarzały? Wciąż wypełniam dokumenty HTML<script type="text/javascript" ...
tagami.type="text/javascript"
i zrobić<script>...</script>
co najmniej zgodnie z HTML5.W JSP możesz użyć tego w dyrektywie strony:
Prawidłowy typ nośnika MIME dla JSON to
application/json
. JSP użyje go do wysłania odpowiedzi do klienta.źródło
„
application/json
” Jest poprawnym typem treści JSON.źródło
Rejestracyjny IANA
application/json
mówiZauważysz, że IANA.org nie wymienia żadnego z tych innych rodzajów mediów , w rzeczywistości nawet
application/javascript
jest już przestarzały. Takapplication/json
naprawdę jest to jedyna możliwa poprawna odpowiedź.Obsługa przeglądarki to inna sprawa.
Najczęściej obsługiwanymi niestandardowymi typami mediów są
text/json
lubtext/javascript
. Ale używają nawet niektórych wielkich nazwisktext/plain
.Jeszcze bardziej dziwny jest nagłówek Content-Type wysyłany przez Flickr, który zwraca JSON as
text/xml
. Google używatext/javascript
dla niektórych swoich aps ajax.Przykłady:
Wynik:
Content-Type: text/javascript
Wynik:
Content-Type: text/xml
źródło
Właściwy typ MIME to
application/json
ALE
Doświadczyłem wielu sytuacji, w których potrzebny był typ przeglądarki lub użytkownik frameworka:
źródło
Korzystam z poniższych
źródło
Content-Type nagłówek powinien być ustawiony na „ application / json ” podczas wysyłania. Serwer nasłuchujący żądania powinien zawierać „ Accept = application / json ”. W Spring MVC możesz to zrobić w następujący sposób:
Dodaj nagłówki do odpowiedzi:
źródło
Na wiosnę masz zdefiniowany typ:
MediaType.APPLICATION_JSON_VALUE
równoważny aplikacji / json .źródło
Używam tego kodu do umieszczania danych w JSON w Google Cloud Storage (GCS), który jest ustawiony do publicznego wyświetlania :
Odzyskiwanie danych jest proste:
źródło
Jeśli JSON jest wyposażony w padding, to będzie
application/jsonp
. Jeśli JSON jest bez wypełnienia, będzieapplication/json
.Aby poradzić sobie z obiema kwestiami, dobrą praktyką jest używanie: „application / javascript” bez zawracania sobie głowy, czy jest to padding czy padding.
źródło
W przypadku JSON używam:
Jest to opisane w propozycji formatu JSON Data Interchange 7158 IETF, sekcja 1.2: Dane techniczne JSON .
źródło
Rozszerzanie akceptowanych odpowiedzi, gdy używasz JSON w kontekście REST ...
Istnieje silny argument na temat używania
application/x-resource+json
iapplication/x-collection+json
reprezentowania zasobów i kolekcji REST.A jeśli zdecydujesz się postępować zgodnie ze specyfikacją jsonapi , powinieneś użyć
application/vnd.api+json
, tak jak jest to udokumentowane.Chociaż nie ma uniwersalnego standardu, jasne jest, że dodany semantyczny do przenoszonych zasobów uzasadnia bardziej wyraźny typ zawartości niż tylko
application/json
.Zgodnie z tym rozumowaniem inne konteksty mogą uzasadniać bardziej szczegółowy typ zawartości .
źródło
application/vnd.api+json
wydaje się być specjalnie dla apis korzystających json: API , bardzo wąski specyfikację z własnymi oczekiwaniami i formatu, nie rozumiem, że jest to dla każdej API, która zwraca JSON. Popraw mnie, jeśli się mylęProgramiści PHP używają tego:
źródło
Jeśli otrzymujesz dane z interfejsu API REST w JSON, musisz użyć typu zawartości
źródło
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- javascriptContent-Type: text/javascript
- javascript ALE przestarzałe, starsze wersje IE używane jako atrybuty HTML.Content-Type: text/x-javascript
- Typy mediów JavaScript ALE przestarzałeContent-Type: text/x-json
- json przed oficjalną rejestracją aplikacji / json.źródło
Formaty JSON (JavaScript Object Notation) i JSONP („JSON with padding”) wydają się być bardzo podobne i dlatego może być bardzo mylące, jakiego typu MIME powinny używać. Mimo że formaty są podobne, istnieją między nimi pewne subtelne różnice.
Dlatego zawsze, gdy mam jakiekolwiek wątpliwości, mam bardzo proste podejście (które w większości przypadków działa idealnie), a mianowicie idź i sprawdź odpowiedni dokument RFC.
JSON RFC 4627 (Aplikacja / json Media Type for JavaScript Object Notation (JSON)) to specyfikacja formatu JSON. W sekcji 6 napisano, że typ nośnika MIME dla tekstu JSON to
JSONP JSONP („JSON z paddingiem”) jest obsługiwany w przeglądarce inaczej niż JSON. JSONP jest traktowany jako zwykły skrypt JavaScript, dlatego powinien używać
application/javascript,
bieżącego oficjalnego typu MIME dla JavaScript. Jednak w wielu przypadkachtext/javascript
typ MIME również będzie działał dobrze.Zauważ, że
text/javascript
został oznaczony jako przestarzały w dokumencie RFC 4329 (Scripting Media Types) i zaleca się użycieapplication/javascript
zamiast niego tekstu. Jednak ze względu na starsze wersjetext/javascript
jest nadal szeroko stosowany i obsługuje wiele przeglądarek (co nie zawsze ma miejsce w przypadkuapplication/javascript
typu MIME, szczególnie w starszych przeglądarkach).źródło