Frage

Ich habe Herumspielen mit JSON für einige Zeit, nur um es als Text Ausschieben und es hat niemanden verletzt (die ich kenne), aber ich mag richtig, Dinge zu tun starten.

Ich habe gesehen, so viele vorgeblichen "Standards" für den JSON Inhaltstyp:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

Aber welche richtig ist, oder am besten? Ich nehme an, dass es Sicherheit und Browser-Unterstützung Fragen variiert zwischen ihnen.

Ich weiß, dass es eine ähnliche Frage, Welche MIME-Typ, wenn JSON durch ein REST-API zurückgegeben wird? , aber ich würde eine etwas gezielte Antwort mag.

War es hilfreich?

Lösung

Für JSON Text:

application/json

  

Der MIME-Medientyp für JSON Text ist application/json . Die Standard-Kodierung ist UTF-8. (Quelle: RFC 4627 )

.

JSONP (runnable JavaScript) mit Rückruf:

  

application/javascript

Hier sind einige Blog-Beiträge, die in den Kommentaren erwähnt wurden, die relevant sind.

Andere Tipps

IANA hat den offiziellen MIME-Typen für JSON als registriert application/json .

Auf die Frage, warum nicht text/json, scheint Crockford gesagt zu haben JSON ist nicht wirklich JavaScript noch Text und auch IANA war eher application/* als text/* auszuteilen.

Weitere Informationen:

Für JSON:

Content-Type: application/json

Für JSON-P :

Content-Type: application/javascript

Natürlich sind die richtigen MIME-Medientypen für JSON ist application/json, aber es ist notwendig, zu erkennen, welche Art von Daten in der Anwendung erwartet wird.

Zum Beispiel verwende ich Ext GWT und die Antwort des Servers gehen muss als text / html enthält aber JSON-Daten.

Client-Seite, Ext GWT Form Hörer

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

Bei Verwendung von application / json Antworttyp, der Browser schlägt mich die Datei zu speichern.

Server-Seite Quellcode-Schnipsel 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:

Antwort wird dynamisch generierten Daten entsprechend den Abfrage-Parameter in der URL übergeben.

Beispiel:

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

Content-Type: application/json


JSON-P:

JSON mit Polsterung. Antwort ist JSON-Daten, mit einem Funktionsaufruf um ihn herum gewickelt.

Beispiel:

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

Content-Type: application/javascript

Wenn Sie Ubuntu oder Debian verwenden und dienen .json Dateien über Apache, könnten Sie die Dateien mit dem richtigen Inhaltstyp dienen sollen. Ich tue dies in erster Linie, weil ich die Firefox-Erweiterung JSONView

verwenden möchten

Der Apache Modul mod_mime hilft dies einfach zu tun. Doch mit Ubuntu müssen Sie die Datei /etc/mime.types und fügen Sie die Zeile

bearbeiten
application/json json

Starten Sie anschließend Apache:

sudo service apache2 restart

Wenn Sie ASP.NET Web Services sind Aufruf von der Client-Seite Sie haben application/json zu verwenden, damit es funktioniert. Ich glaube, das ist das gleiche für die jQuery und Ext Frameworks.

Der richtige Inhaltstyp für JSON ist application/json SOFERN Sie JSONP verwenden, auch als JSON mit Padding bekannt, die ist eigentlich JavaScript und so der richtige Inhaltstyp application/javascript würde.

Es gibt keinen Zweifel daran, dass application/json ist die beste MIME Typ für eine JSON-Antwort.

Aber ich hatte einige Erfahrung, wo ich application/x-javascript hatte zu verwenden, weil einige Kompression Probleme. Mein Hosting-Umgebung ist Shared Hosting mit GoDaddy . Sie erlauben mir nicht Serverkonfigurationen zu ändern. Ich hatte den folgenden Code in meiner web.config Datei hinzugefügt Antworten zum Komprimieren.

<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"/>

Durch die Verwendung dieser, die ASPX-Seiten wurde mit g-zip komprimiert aber JSON Antworten waren nicht. Ich fügte hinzu,

<add mimeType="application/json" enabled="true"/>

in den statischen und dynamischen Typen Abschnitte. Aber das ist nicht JSON Antworten auf alle komprimiert.

Danach habe ich diesen neu hinzugefügten Typen entnommen und

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

sowohl die statischen und dynamischen Typen Abschnitte, und verändert die Antworttyp in

.ashx (asynchron Handler) zu

application/x-javascript

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

application/x-javascript

nur, wenn Sie Ihre JSON Antworten auf Shared-Hosting-Umgebung komprimieren . Da in Shared-Hosting, sie nicht zulassen, dass sich ändern IIS Konfigurationen.

Nur wenn application/json als MIME Typ verwendet habe ich nach dem (Stand: November 2011 mit die neuesten Versionen von Chrome, Firefox mit Firebug ):

  • Keine Warnungen von Chrome, wenn die JSON vom Server geladen wird.
  • Firebug wird eine Registerkarte, um die Antwort fügen Sie die JSON-Daten zeigen, formatiert. Wenn der MIME-Typ unterscheidet, wird es einfach auftauchen wie 'Response-content'.

Nicht alles funktioniert für Inhaltstyp application/json.

Wenn Sie Ext JS Formular-Datei zu laden, beachten Sie, dass die Server-Antwort analysiert wird durch den Browser das Dokument für die <iframe> zu erstellen.

Wenn der Server JSON wird mit dem Rückgabeobjekt zu senden, dann wird die Content-Type Header gesetzt werden müssen, um text/html dem Browser zu sagen, den Text unverändert in das Dokument Körper einzuführen.

Siehe der Ext JS 3.4.0 API-Dokumentation .

JSON ist eine domänenspezifische Sprache (DSL) und ein Datenformat, unabhängig von JavaScript, und als solche hat seine eigene MIME Typ, application/json. Die Achtung des MIME-Typs ist natürlich Client angetrieben, so text/plain für die Übertragung von Bytes tun, aber dann würden Sie Interpretation an die Anbieter Anwendungsdomäne unnötig drängen up - application/json. Würden Sie XML über text/plain übertragen?

Aber ehrlich gesagt, Ihre Wahl des MIME-Typs ist die Beratung für die Kunden, wie der Daten- text/plain oder text/HTML zu interpretieren (wenn es nicht HTML ist) ist wie Typ erasure- es ist so wenig informativ wie macht all Objekte vom Typ Object in eine typisierte Sprache.

Kein Browser Runtime ich kenne, wird ein JSON-Dokument übernehmen und automatisch ohne Eingriff in die Laufzeit als JavaScript-Objekt zugänglich zur Verfügung stellen, aber wenn Sie mit einem verkrüppelten Client arbeiten, das ist eine ganz andere Sache. Aber das ist nicht die ganze Story- RESTful JSON Dienste oft nicht JavaScript Runtimes, aber es nicht stoppen sie mit JSON als entwicklungsfähige Datenaustauschformat. Wenn Kunden die verkrüppelt sind ... dann würde ich prüfen, vielleicht HTML-Injektion über eine Ajax Templating Service statt.

Anwendung / JSON!

Wenn Sie in einer clientseitigen Umgebung sind, die Untersuchung über die Cross-Browser-Unterstützung ist Voraussetzung für eine gut unterstützt Web-Anwendung.

Der richtige HTTP Content-Type application/json würde, wie andere schon zu hervorgehoben, aber einige Kunden haben es nicht sehr gut umgehen, deshalb jQuery den text/html Standard empfiehlt.

Die richtige Antwort lautet:

Content-Type: application/json

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

Aber was hat bisher noch nicht erklärt ist, was die anderen Optionen, die Sie Mittelwert vorgeschlagen.

  • application/x-javascript. Experimental MIME-Typ für JavaScript vor application/javascript gemacht Standard

  • text/javascript: Jetzt obsolet. Sie sollten application/javascript verwenden, wenn mit Hilfe von Javascript.

  • text/x-javascript. Experimental MIME-Typ für die oben beschriebene Situation

  • text/x-json. Experimental MIME-Typ für JSON vor application/json offiziell registriert wurde

Alles in allem, wenn Sie irgendwelche Zweifel an Inhaltstypen haben, sollten Sie überprüfen,

JSP , können Sie diese in Seitendirektive verwenden:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

Die richtige MIME Medientyp für JSON ist application/json. JSP wird es verwenden, um eine Antwort an den Client gesendet wird.

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

Die IANA Registrierung für application/json sagt

  

Anwendungen, die Nutzung dieser Medien: JSON verwendet wurde, um      Austausch von Daten zwischen in allen diesen schriftlichen Bewerbungen      Programmiersprachen: 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 bemerken, dass IANA.org Liste keine von diese anderen Medientypen in der Tat sogar application/javascript jetzt veraltet ist. So application/json ist wirklich die einzig mögliche richtig Antwort.

Browser-Unterstützung ist eine andere Sache.

Die am häufigsten unterstützten Nicht-Standard-Medientypen sind text/json oder text/javascript. Aber einige große Namen sogar text/plain verwenden.

Noch seltsamer ist der Content-Type-Header von Flickr gesendet, die 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

ABER

ich viele Situationen, in denen der Browser-Typ oder der Rahmen Benutzer benötigt erfahren:

text/html

application/javascript

Ich benutze die unten

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

Der Content-Type Header sollte auf ' application / json ' gesetzt werden, wenn die Veröffentlichung. Server für die Anforderung hören sollte enthalten " Akzeptieren = application / json ". In Spring MVC können Sie es wie folgt tun:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

In Header der Antwort:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");

Frühling eine definierte Art haben: MediaType.APPLICATION_JSON_VALUE, die gleichbedeutend ist mit application / json .

  

Die application/json funktionieren gut in PHP ein Array zu speichern oder das Objekt   Daten.

Ich verwende diesen Code Daten in JSON setzen auf Google Cloud Storage (GCS) das ist gesetzt öffentlich sichtbar :

$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 die Daten wieder ist einfach:

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

Wenn die JSON mit Polsterung ist, dann wird es application/jsonp werden. Wenn die JSON ohne Polsterung ist, dann wird es application/json sein.

mit beiden umgehen, es ist eine gute Praxis zu nutzen. ‚Application / javascript‘, ohne sie, ob es mit Polsterung oder ohne Polsterung

Für JSON, ich bin mit:

 Content-Type: application/json

Das im JSON Data Interchange Format 7158 Vorschlag der IETF beschrieben wird, Abschnitt 1.2: Spezifikationen von JSON .

Die Ausweitung der akzeptierten Antworten, wenn Sie mit JSON in einem REST Kontext ...

Es ist ein starkes Argument über die Verwendung von application/x-resource+json und application/x-collection+json wenn Sie vertreten REST-Ressourcen und Sammlungen.

Und wenn Sie die jsonapi Spezifikation, sollten Sie die Verwendung von application/vnd.api+json , wie es dokumentiert ist.

Altough gibt es keine allgemeingültigen Standard, ist es klar, dass die semantische hinzugefügt, um die Ressourcen transferierten zu rechtfertigen ist eine explizitere Content-Type als nur application/json.

Nach dieser Argumentation könnten andere Kontexte rechtfertigen eine spezifischere Content-Type .

PHP-Entwickler verwenden diese:

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

    // Do something here...
?>

Wenn Sie Daten aus REST-API in JSON, so dass Sie Content-Typen 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 RFC 4627 (Die Anwendung / json Medientyp für JavaScript Object Notation (JSON)) ist eine Spezifikation von JSON-Format. Er sagt, in Abschnitt 6, dass der MIME-Medientyp für JSON Text ist

application/json.

JSONP JSONP ( "JSON mit padding") ist, anders als JSON, in einem Browser abgewickelt. JSONP wird als regulärer JavaScript-Skript behandelt und sollte daher den aktuellen offiziellen MIME-Typ für JavaScript verwenden application/javascript,. In vielen Fällen jedoch wird funktionieren text/javascript MIME-Typ auch in Ordnung.

Beachten Sie, dass text/javascript als veraltet markiert wurde von RFC 4329 (Scripting Medientypen) Dokument und es wird empfohlen, stattdessen application/javascript Typen zu verwenden. Doch aufgrund Vermächtnis Gründe wird text/javascript immer noch weit verbreitet, und es hat Cross-Browser-Unterstützung (was nicht immer der Fall mit application/javascript MIME-Typ ist, vor allem bei älteren Browsern).

Content-Type: application/json - json
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - Javascript
Content-Type: text/javascript - javascript BUT veraltet, ältere IE-Versionen verwendet als HTML-Attribut zu verwenden.
Content-Type: text/x-javascript - JavaScript Medientypen BUT veraltet
Content-Type: text/x-json -. json vor application / json wurde offiziell registriert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top