Was ist der richtige JSON-Inhaltstyp?

I've been messing around with JSON for some time, just pushing it out as text and it has't hurt anybody (that I know of), but I'd like to start doing things properly.

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 welcher ist der richtige oder der beste? Ich vermute, dass es unterschiedliche Sicherheits- und Browserunterstützungsprobleme gibt.

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.

Lösung

Für JSON-Text:

application/json

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

Für JSONP (lauffähiges Javascript) mit Callback:

application/javascript

Hier sind einige Blogbeiträge, die in den Kommentaren erwähnt wurden und die relevant sind.

Kommentare (8)

Natürlich ist der korrekte MIME-Medientyp für JSON application/json, aber es ist notwendig zu wissen, welche Art von Daten in Ihrer Anwendung erwartet wird.

Ich verwende zum Beispiel Ext GWT und die Serverantwort muss als text/html erfolgen, enthält aber JSON-Daten.

Client-Seite, Ext GWT Form 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");
    }
});

Bei der Verwendung des Antworttyps application/json schlägt mir der Browser vor, die Datei zu speichern.

Serverseitiger Quellcodeausschnitt 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);
    }
};
Kommentare (1)

Wenn Sie ASP.NET Web Services von der Client-Seite aus aufrufen, müssen Sie application/json verwenden, damit es funktioniert. Ich glaube, dies ist das gleiche für die jQuery und Ext Frameworks.

Kommentare (2)