content-type http - Was ist der korrekte JSON-Inhaltstyp?




header mediatype (25)

Die richtige Antwort ist:

Content-Type: application/json

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"));

Wenn Sie sich in einer clientseitigen Umgebung befinden, ist es für eine gut unterstützte Webanwendung zwingend erforderlich, die Unterstützung des Cross-Browser-Supports zu untersuchen.

Der richtige HTTP-Inhaltstyp wäre " application/json , wie auch andere bereits hervorgehoben haben, aber einige Clients behandeln das nicht sehr gut. Deshalb empfiehlt jQuery den Standardtext " text/html .


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.


Der richtige MIME-Typ ist application/json

ABER

Ich habe viele Situationen erlebt, in denen der Browsertyp oder der Benutzer des Frameworks benötigt wurde:

text/html

application/javascript

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.

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.


PHP-Entwickler verwenden dies:

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

    // Do something here...
?>

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.


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!


Ich benutze das unten

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

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);
    }
};

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).


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

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


Nicht alles funktioniert für den Inhaltstyp application/json .

Wenn Sie das Ext JS Formular zum Hochladen der Datei 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 Content-Type Header auf text/html sein, damit der Browser den Text unverändert in den Dokumenttext einfügen kann.

Weitere Informationen finden Sie in der Dokumentation zur Ext JS 3.4.0 API .


" application/json " ist der korrekte 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())
  }
}

Wenn Sie ASP.NET-Webdienste auf der Clientseite aufrufen, müssen Sie application/json damit es funktioniert. Ich glaube, dass dies für die jQuery und Ext Frameworks das gleiche ist.


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.


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



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.


Für JSON:

Content-Type: application/json

Für JSONP :

Content-Type: 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");

Zuerst müssen Sie sicherstellen, dass der JSON-Code gültig ist.

Danach würde ich empfehlen, eine JavaScript-Bibliothek wie jQuery oder Prototype zu verwenden, wenn Sie können, da diese Dinge in diesen Bibliotheken gut gehandhabt werden.

Wenn Sie andererseits keine Bibliothek verwenden möchten und für die Gültigkeit des JSON-Objekts bürgen können, würde ich die Zeichenfolge einfach in eine anonyme Funktion einfügen und die eval-Funktion verwenden.

Dies wird nicht empfohlen, wenn Sie das JSON-Objekt von einer anderen Quelle erhalten, die nicht absolut vertrauenswürdig ist, da die eval-Funktion möglicherweise Renegade-Code zulässt.

Hier ist ein Beispiel für die Verwendung der Eval-Funktion:

var strJSON = '{"result":true,"count":1}';
var objJSON = eval("(function(){return " + strJSON + ";})()");
alert(objJSON.result);
alert(objJSON.count);

Wenn Sie kontrollieren, welcher Browser verwendet wird, oder Sie sich nicht mit einem älteren Browser Sorgen machen, können Sie immer die JSON.parse-Methode verwenden.

Das ist wirklich die ideale Lösung für die Zukunft.





json content-type