Ich habe eine Weile mit JSON rumgespielt, es nur als Text rausgedrückt und es hat niemanden verletzt (von dem ich weiß), aber ich würde gerne anfangen, Dinge zu tun richtig.
Ich habe so viele angebliche "Standards" für den JSON-Inhaltstyp gesehen:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Aber welches ist richtig oder am besten? Ich stelle fest, dass es Sicherheits- und Browser-Supportprobleme gibt, die sich voneinander unterscheiden.
Ich weiß, dass es eine ähnliche Frage gibt: Welcher MIME-Typ, wenn JSON von einer REST-API zurückgegeben wird?, aber ich hätte gerne eine etwas gezieltere Antwort.
IANA hat den offiziellen MIME-Typ für JSON als application/json
registriert.
Auf die Frage, warum nicht _text/json
_, scheint Crockford gesagt zu haben, dass JSON nicht wirklich JavaScript oder Text ist und dass IANA eher _application/*
_ als _text/*
_ austeilt.
Mehr Ressourcen:
Natürlich ist der richtige MIME-Medientyp für JSON application/json
, aber es muss klar sein, welcher Datentyp in Ihrer Anwendung erwartet wird.
Zum Beispiel verwende ich Ext GWT und die Serverantwort muss text/html lauten, enthält aber JSON-Daten.
Client-Seite, Ext GWT-Formular-Listener
uploadForm.getForm().addListener(new FormListenerAdapter()
{
@Override
public void onActionFailed(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Error");
}
@Override
public void onActionComplete(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Success");
}
});
Wenn Sie den Antworttyp application/json verwenden, empfiehlt mir der Browser, die Datei zu speichern.
Serverseitiges Quellcode-Snippet mit Spring MVC
return new AbstractUrlBasedView()
{
@SuppressWarnings("unchecked")
@Override
protected void renderMergedOutputModel(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.setContentType("text/html");
response.getWriter().write(json);
}
};
Die Antwort besteht aus dynamisch generierten Daten gemäß den in der URL übergebenen Abfrageparametern.
Beispiel:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Inhaltstyp:application/json
JSON mit Polsterung. Die Antwort sind JSON-Daten, die von einem Funktionsaufruf umgeben sind.
Beispiel:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Inhaltstyp:application/javascript
Wenn Sie Ubuntu oder Debian verwenden und .json-Dateien über Apache bereitstellen, möchten Sie möglicherweise die Dateien mit dem richtigen Inhaltstyp bereitstellen. Ich mache das hauptsächlich, weil ich die Firefox-Erweiterung JSONView verwenden möchte
Das Apache-Modul mod_mime hilft Ihnen dabei. Unter Ubuntu müssen Sie jedoch die Datei /etc/mime.types bearbeiten und die Zeile hinzufügen
application/json json
Dann starte Apache neu:
Sudo service Apache2 restart
Der richtige Inhaltstyp für JSON ist application/json
, AUSSER Sie verwenden JSONP , auch bekannt als JSON mit Padding, das eigentlich JavaScript ist. Der richtige Inhaltstyp wäre application/javascript
.
Es besteht kein Zweifel, dass application/json
der beste MIME Typ für eine JSON-Antwort ist.
Ich hatte jedoch einige Erfahrungen mit der Verwendung von application/x-javascript
aufgrund von Komprimierungsproblemen. Meine Hosting-Umgebung ist Shared Hosting mit GoDaddy . Sie erlauben mir nicht, Serverkonfigurationen zu ändern. Ich habe meiner web.config
-Datei den folgenden Code zum Komprimieren von Antworten hinzugefügt.
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
Auf diese Weise wurden die ASPX-Seiten mit g-Zip komprimiert, JSON-Antworten jedoch nicht. Ich fügte hinzu
<add mimeType="application/json" enabled="true"/>
in den Abschnitten statische und dynamische Typen. Dies komprimiert jedoch keine JSON-Antworten.
Danach habe ich diesen neu hinzugefügten Typ entfernt und hinzugefügt
<add mimeType="application/x-javascript" enabled="true"/>
in den Abschnitten für statische und dynamische Typen und änderte den Antworttyp in
.ashx (asynchroner Handler) zu
application/x-javascript
Und jetzt stellte ich fest, dass meine JSON-Antworten mit g-Zip komprimiert wurden. Daher empfehle ich persönlich die Verwendung
application/x-javascript
nur wenn Sie Ihre JSON-Antworten in einer gemeinsam genutzten Hosting-Umgebung komprimieren möchten . Weil sie Ihnen beim Shared Hosting nicht erlauben, IIS Konfigurationen zu ändern.
Nur bei Verwendung von application/json
als MIME Typ habe ich folgendes (ab November 2011 mit den neuesten Versionen von Chrome, Firefox mit Firebug ):
Nicht alles funktioniert für den Inhaltstyp application/json
.
Wenn Sie Ext JS form submit to upload file verwenden, beachten Sie, dass die Serverantwort vom Browser analysiert wird, um das Dokument für den <iframe>
zu erstellen.
Wenn der Server JSON zum Senden des Rückgabeobjekts verwendet, muss der Header Content-Type
auf text/html
gesetzt werden, damit der Browser den Text unverändert in den Dokumenttextkörper einfügt.
JSON ist eine domänenspezifische Sprache (DSL) und ein von JavaScript unabhängiges Datenformat und hat als solches einen eigenen MIME -Typ, application/json
. Der Respekt für MIME-Typen ist natürlich mandantengesteuert, so dass text/plain
möglicherweise für die Übertragung von Bytes gilt, aber Sie würden dann die Interpretation unnötigerweise in die Anwendungsdomäne des Anbieters verschieben - application/json
. Würden Sie XML über text/plain
übertragen?
Aber ehrlich gesagt, Ihre Wahl des MIME-Typs ist ein Ratschlag für den Kunden, wie die Daten zu interpretieren sind - text/plain
oder text/HTML
(wenn es sich nicht um HTML handelt) ist wie das Löschen von Typen - es ist so wenig aussagekräftig, als würden Sie alle Daten löschen Objekte vom Typ Objekt in einer typisierten Sprache.
Keine mir bekannte Browser-Laufzeit nimmt ein JSON-Dokument und stellt es der Laufzeit automatisch ohne Eingreifen als JavaScript-zugängliches Objekt zur Verfügung. Wenn Sie jedoch mit einem verkrüppelten Client arbeiten, ist dies eine ganz andere Angelegenheit. Aber das ist nicht die ganze Geschichte RESTful JSON-Services haben oft keine JavaScript-Laufzeiten, aber es hindert sie nicht daran, JSON als praktikables Datenaustauschformat zu verwenden. Wenn Clients so verkrüppelt sind ... dann würde ich vielleicht eine HTML-Injection über einen Ajax Template-Service in Betracht ziehen.
Anwendung/JSON!
Wenn Sie sich in einer clientseitigen Umgebung befinden, müssen Sie sich über die Unterstützung für mehrere Browser informieren, damit eine gut unterstützte Webanwendung funktioniert.
Der richtige HTTP-Inhaltstyp wäre application/json
, wie andere bereits hervorgehoben haben, aber einige Clients kommen damit nicht sehr gut zurecht. Deshalb empfiehlt jQuery den Standardwert text/html
.
Die richtige Antwort ist:
Content-Type: application/json
Wie viele andere bereits erwähnt haben, ist application/json
die richtige Antwort.
Was jedoch noch nicht erklärt wurde, sind die anderen von Ihnen vorgeschlagenen Optionen.
application/x-javascript
: Experimenteller MIME-Typ für JavaScript, bevor application/javascript
zum Standard gemacht wurde.
text/javascript
: Jetzt veraltet. Sie sollten application/javascript
verwenden, wenn Sie Javascript verwenden.
text/x-javascript
: Experimenteller MIME-Typ für die oben genannte Situation.
text/x-json
: Experimenteller MIME-Typ für JSON, bevor application/json
offiziell registriert wurde.
Alles in allem sollten Sie bei Zweifeln an den Inhaltstypen diesen Link aktivieren
"application/json
" ist der richtige JSON-Inhaltstyp.
def ajaxFindSystems = {
def result = Systems.list()
render(contentType:'application/json') {
results {
result.each{sys->
system(id:sys.id, name:sys.name)
}
}
resultset (rows:result.size())
}
}
In der IANA-Registrierung für application/json
steht
Anwendungen, die diesen Medientyp verwenden: Mit JSON wurden Daten zwischen Anwendungen ausgetauscht, die in den folgenden Programmiersprachen geschrieben wurden: ActionScript, C, C #, Clojure, ColdFusion, Gemeinsames LISP, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala und Schema.
Sie werden feststellen, dass IANA.org keine dieser anderen Medientypen auflistet , sogar application/javascript
ist jetzt veraltet. Also ist application/json
wirklich die einzig mögliche richtige Antwort.
Browser-Unterstützung ist eine andere Sache.
Die am häufigsten unterstützten nicht standardmäßigen Medientypen sind text/json
oder text/javascript
. Aber einige große Namen benutzen sogar text/plain
.
Noch seltsamer ist der von Flickr gesendete Content-Type-Header, der JSON als text/xml
zurückgibt. Google verwendet text/javascript
für einige seiner Ajax-Apis.
Beispiele:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Ausgabe: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Ausgabe: Content-Type: text/xml
Der richtige MIME-Typ ist application/json
BUT
Ich habe viele Situationen erlebt, in denen der Browsertyp oder der Framework-Benutzer Folgendes benötigte:
_text/html
application/javascript
_
Ich benutze das Folgende
contentType: 'application/json',
data: JSON.stringify(SendData),
Der Header Content-Type sollte beim Posten auf 'application/json' gesetzt werden. Der Server, der auf die Anforderung wartet, sollte "Accept = application/json" enthalten. In Spring MVC kannst du das so machen:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Fügen Sie der Antwort Header hinzu:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
In Spring haben Sie einen definierten Typ: MediaType.APPLICATION_JSON_VALUE
, der application/json entspricht.
Der
application/json
funktioniert hervorragend in PHP, um ein Array oder Objektdaten zu speichern.
Ich verwende diesen Code, um Daten in JSON auf Google Cloud Storage (GCS) zu setzen, das öffentlich sichtbar ist :
$context = stream_context_create([
'gs' => [
'acl'=>'public-read',
'Content-Type' => 'application/json',
]
]);
file_put_contents(
"gs://BUCKETNAME/FILENAME.json",
json_encode((object) $array),
false,
$context
);
Das Zurückholen der Daten ist ganz einfach:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Für JSON verwende ich:
Content-Type: application/json
Dies ist im Vorschlag für das JSON Data Interchange Format 7158 der IETF beschrieben Abschnitt 1.2: Spezifikationen von JSON .
Wenn der JSON mit Auffüllung versehen ist, ist dies application/jsonp
. Wenn der JSON ohne Auffüllung ist, ist es application/json
.
Um mit beidem fertig zu werden, ist es eine gute Praxis, 'application/javascript' zu verwenden, ohne sich darum zu kümmern, ob es mit oder ohne Auffüllung ist.
Erweitern der akzeptierten Antworten, wenn Sie JSON in einem REST -Kontext verwenden ...
Es gibt ein starkes Argument zur Verwendung von application/x-resource+json
und application/x-collection+json
, wenn Sie REST Ressourcen und Sammlungen darstellen.
Und wenn Sie sich entscheiden, die jsonapi Spezifikation zu befolgen, Sie sollten verwenden Sie application/vnd.api+json
, wie es dokumentiert ist.
Obwohl es keinen universellen Standard gibt, ist es klar, dass die den übertragenen Ressourcen hinzugefügte Semantik einen expliziteren Inhaltstyp rechtfertigt als nur application/json
.
Nach dieser Überlegung könnten andere Kontexte einen spezifischeren Inhaltstyp rechtfertigen.
PHP-Entwickler verwenden dies:
<?php
header("Content-type: application/json");
// Do something here...
?>
Wenn Sie Daten von der REST -API in JSON abrufen, müssen Sie den Inhaltstyp verwenden
For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml
JSON (JavaScript Object Notation) und JSONP ("JSON with padding") scheinen sehr ähnlich zu sein und daher ist es möglicherweise sehr verwirrend, welchen MIME-Typ sie haben sollte mit. Obwohl die Formate ähnlich sind, gibt es einige subtile Unterschiede zwischen ihnen.
Wenn also Zweifel bestehen, habe ich einen sehr einfachen Ansatz (der in den meisten Fällen einwandfrei funktioniert), nämlich das entsprechende RFC-Dokument zu überprüfen.
JSONRFC 4627 (Der application/json-Medientyp für JavaScript-Objektnotation (JSON)) ist eine Spezifikation von JSON Format. In Abschnitt 6 heißt es, dass der MIME-Medientyp für JSON-Text ist
application/json.
JSONP JSONP ("JSON with padding") wird in einem Browser anders behandelt als JSON. JSONP wird als reguläres JavaScript-Skript behandelt und sollte daher application/javascript,
als aktuellen offiziellen MIME-Typ für JavaScript verwenden. In vielen Fällen funktioniert jedoch auch der MIME-Typ text/javascript
.
Beachten Sie, dass text/javascript
durch RFC 4329 (Scripting Media Types) als veraltet markiert wurde, und es wird empfohlen, stattdessen den Typ application/javascript
zu verwenden. Aus älteren Gründen wird text/javascript
jedoch immer noch häufig verwendet und unterstützt Cross-Browser (was bei application/javascript
MIME-Typen, insbesondere bei älteren Browsern, nicht immer der Fall ist).
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- JavascriptContent-Type: text/javascript
- Javascript ABER veraltete, ältere IE Versionen, die als HTML-Attribut verwendet wurden.Content-Type: text/x-javascript
- JavaScript-Medientypen ABER veraltetContent-Type: text/x-json
- json vor Antragstellung/json wurde offiziell registriert.
Um das interessante JSON-Ergebnis anzugeben, fügen Sie "application/json" wie folgt in den Anforderungsheader ein:
"Accept: application/json" ist ein gewünschtes Antwortformat.
"Content-Type: application/json" gibt das Inhaltsformat Ihrer Anfrage an, aber manchmal geben Sie sowohl application/json
als auch application/xml
an, aber die Qualität dieser kann unterschiedlich sein. Welcher Server die verschiedenen Antwortformate zurücksendet, sehen Sie sich das Beispiel an:
Accept:application/json;q=0.4,application/xml;q=8
Dies gibt XML zurück, da XML eine höhere Qualität aufweist.
Der richtige aktuelle Standard ist application/json
. Während die Standardkodierung UTF-8 ist, sollte erwähnt werden, dass es sich auch um UTF-16 oder utf-32 handeln kann. Wenn JSON in UTF-16 oder UTF-32 geschrieben ist, muss die binäre Inhaltsübertragungscodierung verwendet werden.
Weitere Informationen zu json finden Sie hier: https://tools.ietf.org/html/rfc4627
weitere Informationen zur binären Übertragungscodierung finden Sie hier: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
Ergänzend zu den restlichen Antworten lautet der MIME-Typ für JSON-verknüpfte Daten (JSON-LD) gemäß W3C :
application/ld+json
Typname: Anwendung
Name des Untertyps: ld + json
Zusätzlich aus derselben Quelle:
Dateierweiterung (en) :
.jsonld
Versuchen Sie immer, sich diese drei Inhaltstypen zu merken, obwohl es viele Inhaltstypen gibt. da Sie diese möglicherweise häufiger verwenden müssen.