with - Was ist der korrekte JSON-Inhaltstyp?




with mime type application json (20)

Ich beschäftige mich seit einiger Zeit mit JSON , habe es einfach als Text ausgegeben und es hat niemanden verletzt (von dem ich wüsste).

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 was ist richtig oder am besten? Ich habe festgestellt, dass es Sicherheits- und Browser-Supportprobleme gibt, die sich voneinander unterscheiden.

Ich weiß, es gibt eine ähnliche Frage: Welcher MIME-Typ, wenn JSON von einer REST-API zurückgegeben wird? , aber ich hätte gerne eine etwas gezieltere Antwort.


Die application/json hervorragend für die Speicherung von Array- oder Objektdaten in PHP.

Ich verwende diesen Code, um Daten in JSON in Google Cloud Storage (GCS) zu speichern, das öffentlich einsehbar 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
);

Um zurück zu kommen sind die Daten einfach:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

JSON:

Antwort ist dynamisch generierte Daten entsprechend den in der URL übergebenen Abfrageparametern.

Beispiel:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

Inhaltstyp: application/json

JSON-P:

JSON mit Polsterung. Antwort ist JSON-Daten, mit einem Funktionsaufruf umwickelt.

Beispiel:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

Inhaltstyp: application/javascript


Der Content-Type- Header sollte beim Buchen auf " application / json " gesetzt werden. Der Server, der auf die Anforderung wartet, sollte " Accept = application / json " enthalten. In Spring MVC kannst du es 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");

Der richtige Inhaltstyp für JSON ist application/json . Sie verwenden JSONP , auch bekannt als JSON mit Padding. Hierbei handelt es sich um JavaScript. In diesem Fall handelt es sich bei JavaScript um den richtigen Inhaltstyp.


Die IANA-Registrierung für application/json sagt

Anwendungen, die diesen Medientyp verwenden: Mit JSON wurden Daten zwischen Anwendungen ausgetauscht, die in allen folgenden Programmiersprachen geschrieben wurden: ActionScript, C, C #, Clojure, ColdFusion, Common 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. In der Tat ist sogar application/javascript inzwischen veraltet. Damit 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 . Einige große Namen verwenden jedoch sogar text/plain .

Noch merkwürdiger ist der Content-Type-Header, der von Flickr gesendet wird, 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


Die akzeptierten Antworten erweitern, wenn Sie JSON in einem REST-Kontext verwenden ...

Es gibt ein starkes Argument für die Verwendung von application/x-resource+json und application/x-collection+json wenn Sie REST-Ressourcen und Sammlungen darstellen.

Wenn Sie sich für die jsonapi- Spezifikation entscheiden, sollten Sie die application/vnd.api+json , da diese dokumentiert ist.

Obwohl es keinen universellen Standard gibt, ist es klar, dass die hinzugefügte Semantik zu den übertragenen Ressourcen einen expliziteren Content-Type als nur application/json rechtfertigt.

Aufgrund dieser Überlegungen könnten andere Kontexte einen spezifischeren Inhaltstyp rechtfertigen.


Es besteht kein Zweifel, dass application/json der beste MIME Typ für eine JSON-Antwort ist.

Ich hatte jedoch einige Erfahrung, bei denen ich wegen einiger Komprimierungsprobleme application/x-javascript . Meine Hosting-Umgebung wird mit GoDaddy . Sie erlauben mir nicht, Serverkonfigurationen zu ändern. Ich hatte der Datei web.config den folgenden Code zum Komprimieren der 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"/>

Dadurch 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 entfernte ich diesen neu hinzugefügten Typ und fügte hinzu

<add mimeType="application/x-javascript" enabled="true"/>

in den Abschnitten statische und dynamische Typen und änderte den Antworttyp in

.ashx (asynchroner Handler) an

application/x-javascript

Und jetzt stellte ich fest, dass meine JSON-Antworten mit g-zip komprimiert wurden. Also empfehle ich persönlich zu verwenden

application/x-javascript

Nur wenn Sie Ihre JSON-Antworten in einer gemeinsam genutzten Hosting-Umgebung komprimieren möchten. Da beim Shared Hosting die IIS Konfigurationen nicht geändert werden können.



Ich benutze das unten

contentType: 'application/json',
data: JSON.stringify(SendData),

Im Spring Sie einen definierten Typ: MediaType.APPLICATION_JSON_VALUE der zu application / json äquivalent ist.


JSON ist eine domänenspezifische Sprache (DSL) und ein von JavaScript unabhängiges Datenformat. Als solches verfügt es über einen eigenen MIME Typ, application/json . Respekt für MIME-Typen ist natürlich vom Client abhängig, so dass text/plain möglicherweise für die Übertragung von Bytes geeignet ist, aber dann würden Sie die Interpretation unnötig in die Herstelleranwendungsdomäne verschieben - application/json . Würden Sie XML per text/plain ?

Aber ehrlich gesagt, Sie haben den MIME-Typ als Ratschlag für die Interpretation des Datentyps text/plain oder text/HTML (wenn es sich nicht um HTML handelt) wie das Löschen von Typen bezeichnet. Es ist ebenso wenig informativ wie das Erstellen aller Objekte des Typs Object in einer getippten Sprache.

Keine Browser-Laufzeit, die ich kenne, nimmt ein JSON-Dokument und stellt es ohne Eingriff automatisch für die Laufzeit als auf JavaScript zugreifbares Objekt zur Verfügung. Wenn Sie jedoch mit einem verkrüppelten Client arbeiten, ist das eine ganz andere Sache. Dies ist jedoch nicht die ganze Geschichte. RESTful JSON-Services verfügen häufig nicht über JavaScript-Laufzeiten, sie hindern sie jedoch nicht daran, JSON als praktikables Datenaustauschformat zu verwenden. Wenn Kunden so verkrüppelt sind, würde ich stattdessen die HTML-Injection über einen Ajax Vorlagendienst in Betracht ziehen.

Anwendung / JSON!


Natürlich ist application/json der richtige MIME-Medientyp für JSON. Es ist jedoch notwendig zu wissen, welche Art von Daten in Ihrer Anwendung erwartet werden.

Zum Beispiel verwende ich Ext GWT und die Serverantwort muss als Text / html ausgeführt werden , enthält jedoch JSON-Daten.

Clientseite, Ext GWT-Formularlistener

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, schlägt der Browser vor, die Datei zu speichern.

Serverseitiger Quellcode-Ausschnitt 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);
    }
};

Nur wenn Sie application/json als MIME Typ verwenden, habe ich Folgendes (ab November 2011 mit den neuesten Versionen von Chrome, Firefox mit Firebug ):

  • Keine weiteren Warnungen von Chrome, wenn der JSON vom Server geladen wird.
  • Firebug fügt der Antwort eine Registerkarte hinzu, die Ihnen die formatierten JSON-Daten anzeigt. Wenn der MIME-Typ unterschiedlich ist, wird er nur als "Antwortinhalt" angezeigt.

PHP-Entwickler verwenden dies:

<?php
    header("Content-type: application/json");

    // Do something here...
?>

Wenn Sie Daten von der REST-API in JSON erhalten, 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

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 dies hauptsächlich, weil ich die Firefox-Erweiterung JSONView

Das Apache-Modul mod_mime Ihnen dabei. Bei Ubuntu müssen Sie jedoch die Datei /etc/mime.types bearbeiten und die Zeile hinzufügen

application/json json

Starten Sie dann Apache neu:

sudo service apache2 restart

Wenn das JSON mit Padding application/jsonp ist, wird es application/jsonp . Wenn das JSON ohne Auffüllen ist, wird es application/json .

Um mit beiden umzugehen, ist es ratsam, 'application / javascript' zu verwenden, ohne sich darum zu kümmern, ob es sich um eine Auffüllung oder um eine Auffüllung handelt.


Wie viele andere bereits erwähnt haben, ist application/json die richtige Antwort.

Was noch nicht erklärt wurde, ist, was die anderen von Ihnen vorgeschlagenen Optionen bedeuten.

  • application/x-javascript : Experimenteller MIME-Typ für JavaScript vor der application/javascript wurde zum Standard.

  • text/javascript : Jetzt obsolet. Sie sollten application/javascript wenn Sie Javascript verwenden.

  • text/x-javascript : Experimenteller MIME-Typ für die obige Situation.

  • text/x-json : Experimenteller MIME-Typ für JSON, bevor application/json offiziell registriert wurde.

Alles in allem sollten Sie diesen Link immer dann überprüfen, wenn Sie Zweifel an den Inhaltstypen haben


JSON Formate JSON (JavaScript Object Notation) und JSONP ("JSON with padding") scheinen sich sehr ähnlich zu sein. Daher kann es sehr verwirrend sein, welchen MIME-Typ sie verwenden sollen. Obwohl die Formate sehr ähnlich zu sein scheinen, gibt es einige Unterschiede zwischen ihnen.

Also, wenn ich Zweifel habe, habe ich einen sehr einfachen Ansatz (der in den meisten Fällen perfekt funktioniert), nämlich das entsprechende RFC-Dokument zu überprüfen.

JSON RFC 4627 (Der JSON- Typ application / json Media Type für JavaScript Object Notation) ist eine Spezifikation des JSON-Formats. 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 als JSON behandelt. JSONP wird wie ein normales JavaScript-Skript behandelt und sollte daher application/javascript, den aktuellen offiziellen MIME-Typ für JavaScript. In vielen Fällen funktioniert der text/javascript MIME-Typ jedoch ebenfalls text/javascript .

Beachten Sie, dass text/javascript vom Dokument rfc-editor.org/rfc/rfc4329.txt (Scripting Media Types) als obsolet markiert wurde, und es wird empfohlen, stattdessen application/javascript verwenden. Aus Gründen des text/javascript wird text/javascript jedoch immer noch häufig verwendet und es wird browserübergreifend unterstützt (was bei application/javascript MIME-Typ, insbesondere bei älteren Browsern, nicht immer der Fall ist).


Content-type: application/json - json
Content-Type: application/javascript - json-P
Content-type: application/x-javascript - Javascript
Content-type: text/javascript - Javascript ABER obsolet, ältere IE-Versionen werden als HTML-Attribut verwendet.
Content-type: text/x-javascript - JavaScript-Medientypen, aber veraltet
Content-type: text/x-json - json vor der Anmeldung / json wurde offiziell registriert.





content-type