risposta-alla-domanda-sullo-sviluppo-web-bd.com

Qual è il tipo di contenuto JSON corretto?

Ho lavorato con JSON per un po 'di tempo, spingendolo fuori come testo e non ha ferito nessuno (che io sappia), ma mi piacerebbe iniziare a fare le cose correttamente.

Ho visto così molti presunti "standard" per il tipo di contenuto JSON:

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

Ma quale è corretto o meglio? Considero che ci sono problemi di sicurezza e di supporto del browser che variano tra di loro.

So che c'è una domanda simile,Quale tipo MIME se JSON viene restituito da un'API REST API?, ma mi piacerebbe una risposta leggermente più mirata.

9670
Oli

Per il testo JSON:

application/json

Il tipo di supporto MIME per il testo JSON èapplication/json. La codifica predefinita è UTF-8. (Fonte: RFC 4627 ).

Per JSONP (javascript eseguibile) con callback:

application/javascript

Ecco alcuni post sui blog che sono stati menzionati nei commenti che sono rilevanti.

9674
Gumbo

IANA ha registrato il tipo MIME ufficiale per JSON comeapplication/json.

Alla domanda sul perché non text/json, sembra che Crockford abbia detto che JSON non è realmente JavaScript né testo e anche IANA ha più probabilità di distribuire application/* di text/*.

Altre risorse:

1557
gnrfan

Per JSON:

Content-Type: application/json

Per JSON-P :

Content-Type: application/javascript
833
Alix Axel

Naturalmente, il tipo di supporto MIME corretto per JSON è application/json, ma è necessario rendersi conto di quale tipo di dati è previsto nella propria applicazione.

Ad esempio, uso Ext GWT e la risposta del server deve andare come text/html ma contiene dati JSON.

Lato client, listener del modulo Ext GWT

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

In caso di utilizzo di application/json response, il browser mi suggerisce di salvare il file.

Snippet di codice sorgente lato server usando 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);
    }
};
610
Mikhail.Mamaev

JSON:

La risposta è dati generati dinamicamente, in base ai parametri della query passati nell'URL.

Esempio:

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

Content-Type: application/json


JSON-P:

JSON con imbottitura. La risposta è dati JSON, con una chiamata di funzione avvolta attorno ad esso.

Esempio:

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

Content-Type: application/javascript

452
Bhavin

Se stai usando Ubuntu o Debian e servi file .json tramite Apache, potresti voler servire i file con il tipo di contenuto corretto. Lo sto facendo principalmente perché voglio usare l'estensione per Firefox JSONView

Il modulo Apache mod_mime aiuterà a farlo facilmente. Tuttavia, con Ubuntu è necessario modificare il file /etc/mime.types e aggiungere la riga

application/json json

Quindi riavviare Apache:

Sudo service Apache2 restart
387
Gourneau

Se si chiamano i servizi Web ASP.NET dal lato client, è necessario utilizzare application/json affinché funzioni. Credo che questo sia lo stesso per i framework jQuery e Ext .

372
markvpc

Il tipo di contenuto giusto per JSON è application/json A MENO che stai usando JSONP , noto anche come JSON con Padding, che in realtà è JavaScript e quindi il tipo di contenuto giusto sarebbe application/javascript.

296
Resist Design

Non c'è dubbio che application/json è il migliore MIME type per una risposta JSON.

Ma avevo una certa esperienza in cui dovevo usare application/x-javascript a causa di alcuni problemi di compressione. Il mio ambiente di hosting è l'hosting condiviso con GoDaddy . Non mi permettono di cambiare le configurazioni del server. Ho aggiunto il seguente codice al mio file web.config per la compressione delle risposte.

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

Usando questo, le pagine .aspx sono state compresse con g-Zip ma non le risposte JSON. Ho aggiunto

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

nelle sezioni dei tipi statici e dinamici. Ma questo non comprime affatto le risposte JSON.

Successivamente ho rimosso questo tipo appena aggiunto e aggiunto

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

in entrambe le sezioni di tipi statici e dinamici e ha modificato il tipo di risposta in

.ashx (gestore asincrono) a

application/x-javascript

E ora ho scoperto che le mie risposte JSON erano compresse con g-Zip. Quindi personalmente raccomando di usare

application/x-javascript

solo se si desidera comprimere le risposte JSON su ambiente di hosting condiviso. Perché nell'hosting condiviso, non ti permettono di cambiare IIS configurazioni.

285
shashwat

Solo quando si usa application/json come MIME type ho il seguente (a partire da novembre 2011 con le versioni più recenti di Chrome, Firefox con Firebug ):

  • Non più avvisi da Chrome quando il JSON viene caricato dal server.
  • Firebug aggiungerà una scheda alla risposta mostrandoti i dati JSON formattati. Se il tipo MIME è diverso, verrà semplicemente visualizzato come "Contenuto risposta".
259
Ivo Limmen

Non tutto funziona per il tipo di contenuto application/json.

Se si sta utilizzando Ext JS form inviare per caricare il file, tenere presente che la risposta del server viene analizzata dal browser per creare il documento per <iframe>.

Se il server utilizza JSON per inviare l'oggetto restituito, l'intestazione Content-Type deve essere impostata su text/html per indicare al browser di inserire il testo invariato nel corpo del documento.

Vedere la documentazione dell'API Ext JS 3.4.0 .

234
Conan

JSON è un linguaggio specifico del dominio (DSL) e un formato dati indipendente da JavaScript, e come tale ha il proprio MIME type, application/json. Il rispetto per i tipi MIME è ovviamente guidato dal client, quindi text/plain può fare per il trasferimento dei byte, ma in questo modo si aumenterebbe inutilmente l'interpretazione del dominio dell'applicazione fornitore - application/json. Vuoi trasferire XML tramite text/plain?

Ma, onestamente, la scelta del tipo MIME è un consiglio al cliente su come interpretare i dati: text/plain o text/HTML (quando non è HTML) è come la cancellazione di tipi- è poco informativo come rendere tutti gli oggetti di tipo Object in una lingua tipizzata .

Nessun runtime del browser che conosca prenderà un documento JSON e lo renderà automaticamente disponibile al runtime come oggetto accessibile JavaScript senza intervento, ma se si sta lavorando con un client storpio, è una questione completamente diversa. Ma non è tutta la storia- RESTful I servizi JSON spesso non hanno runtime in JavaScript, ma non impedisce loro di utilizzare JSON come formato di scambio di dati valido. Se i client sono così danneggiati ... allora prenderei in considerazione forse l'iniezione HTML tramite un Ajax servizio di traduzione invece.

Applicazione/JSON!

219
VLostBoy

Se ci si trova in un ambiente lato client, è necessario effettuare accertamenti sul supporto di più browser per un'applicazione Web ben supportata.

Il tipo di contenuto HTTP giusto sarebbe application/json, come già evidenziato anche da altri, ma alcuni client non lo gestiscono molto bene, ecco perché jQuery consiglia il text/html predefinito.

203

La risposta corretta è:

Content-Type: application/json
161
Irfan DANISH

Come molti altri hanno menzionato, application/json è la risposta corretta.

Ma ciò che non è stato ancora spiegato è ciò che significano le altre opzioni che hai proposto.

  • application/x-javascript: tipo MIME sperimentale per JavaScript prima che application/javascript venisse reso standard.

  • text/javascript: ora obsoleto. Dovresti usare application/javascript quando usi javascript.

  • text/x-javascript: tipo MIME sperimentale per la situazione di cui sopra.

  • text/x-json: tipo MIME sperimentale per JSON prima che application/json sia stato registrato ufficialmente.

Tutto sommato, ogni volta che hai dei dubbi sui tipi di contenuto, dovresti controllare questo link

158
fcm

In JSP , puoi usare questa direttiva nella pagina:

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

Il tipo corretto MIME per JSON è application/json. JSP lo userà per inviare una risposta al cliente.

141
raja

"application/json" è il tipo di contenuto JSON corretto.

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

La registrazione IANA per application/json dice

Applicazioni che utilizzano questo tipo di supporto: JSON è stato utilizzato per scambiare dati tra applicazioni scritte in tutti questi linguaggi di programmazione: ActionScript, C, C #, Clojure, ColdFusion, Common LISP, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala e Scheme.

Noterai che IANA.org non elenca nessuno di questi altri tipi di media , infatti anche application/javascript è ora obsoleto. Quindi application/json è davvero l'unica possibile correct answer.

Il supporto del browser è un'altra cosa.

I tipi di media non standard più supportati sono text/json o text/javascript. Ma alcuni grandi nomi usano anche text/plain.

Ancora più strana è l'intestazione Content-Type inviata da Flickr, che restituisce JSON come text/xml. Google usa text/javascript per alcuni dei suoi apis ajax.

Esempi:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

Uscita: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

Uscita: Content-Type: text/xml

101
Jhawins

Il tipo MIME corretto èapplication/json

MA

Ho sperimentato molte situazioni in cui era necessario il tipo di browser o l'utente del framework:

text/html

application/javascript
84
LombaX

Io uso il sotto

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

Il Content-Type header deve essere impostato su ' application/json ' quando si postano. Il server che ascolta la richiesta dovrebbe includere " Accept = application/json ". In Spring MVC puoi farlo in questo modo:

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

Aggiungi intestazioni alla risposta:

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

In Spring avete un tipo definito: MediaType.APPLICATION_JSON_VALUE che è equivalente a application/json .

56
Chand Priyankara

application/json funziona alla grande in PHP per memorizzare un array o dati oggetto.

Uso questo codice per inserire dati in JSON in Google Cloud Storage (GCS) che è impostato visualizzabile pubblicamente :

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

Per recuperare i dati è semplice:

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

Per JSON, sto usando:

 Content-Type: application/json

Questo è descritto nella proposta JSON Data Interchange Format 7158 di IETF, Sezione 1.2: Specifiche di JSON .

48
Mehmet_

Se il JSON è con padding, allora sarà application/jsonp. Se il JSON è senza padding, allora sarà application/json.

Per trattare entrambi, è una buona pratica usare: 'application/javascript' senza preoccuparsi se è con padding o senza padding.

48
Ankit Zalani

Estendere le risposte accettate, quando si utilizza JSON in un contesto REST ...

C'è un argomento forte sull'utilizzo di application/x-resource+json e application/x-collection+json quando si rappresentano REST risorse e raccolte.

E se decidi di seguire la jsonapi specifica, dovresti usare application/vnd.api+json, come è documentato.

Anche se non esiste uno standard universale, è chiaro che la semantica aggiunta alle risorse trasferite giustifica un Content-Type più esplicito di un semplice application/json.

Seguendo questo ragionamento, altri contesti potrebbero giustificare un più specifico Content-Type.

41
jgomo3

Gli sviluppatori PHP usano questo:

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

    // Do something here...
?>
40
user3087089

Se ottieni dati da REST API in JSON, devi usare content-type

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
38
Krishna

JSON (JavaScript Object Notation) e JSONP ("JSON con padding") i formati sembra essere molto simile e quindi potrebbe essere molto confuso quale tipo MIME dovrebbero usare. Anche se i formati sono simili, ci sono alcune sottili differenze tra loro.

Quindi, ogni volta che ho dei dubbi, ho un approccio molto semplice (che funziona perfettamente nella maggior parte dei casi), vale a dire, andare e controllare il corrispondente documento RFC.

JSONRFC 4627 (L'applicazione/json Media Type per JavaScript Object Notation (JSON)) è una specifica del formato JSON. Dice nella sezione 6 che il tipo di media MIME per il testo JSON è

application/json.

JSONPJSONP ("JSON con padding") viene gestito in modo diverso da JSON, in un browser. JSONP è trattato come uno script JavaScript regolare e quindi dovrebbe utilizzare application/javascript, il tipo MIME ufficiale attuale per JavaScript. In molti casi, tuttavia, il tipo MIME text/javascript funzionerà correttamente.

Si noti che text/javascript è stato contrassegnato come obsoleto dal documento RFC 4329 (Scripting Media Types) e si consiglia di utilizzare invece il tipo application/javascript. Tuttavia, a causa di motivi legacy, text/javascript è ancora ampiamente utilizzato e ha il supporto per browser (che non è sempre un caso con application/javascript tipo MIME, specialmente con i browser più vecchi).

24

Content-Type: application/json - json
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - javascript
Content-Type: text/javascript - javascript MA versioni obsolete, più vecchie IE utilizzate come attributo html.
Content-Type: text/x-javascript - Tipi di supporti JavaScript BUT obsoleti
Content-Type: text/x-json - json prima dell'applicazione/json è stato ufficialmente registrato.

23
Kashif Solangi

Per specificare l'interessante risultato JSON, aggiungi "application/json" nell'intestazione della richiesta come di seguito:

"Accept: application/json" è il formato di risposta desiderato.

"Content-Type: application/json" specifica il formato del contenuto della tua richiesta, ma a volte specifichi sia application/json che application/xml, ma la qualità di questi potrebbe essere diversa. Quale server invierà i diversi formati di risposta, guarda l'esempio:

Accept:application/json;q=0.4,application/xml;q=8

Ciò restituirà XML, poiché XML ha una qualità superiore.

6
behzad babaei

Lo standard corrente corretto è application/json. Mentre la codifica predefinita è UTF-8, vale la pena ricordare che potrebbe anche essere UTF-16 o utf-32. Quando JSON è scritto in UTF-16 o UTF-32, è necessario utilizzare la codifica del trasferimento di contenuto binario.

Ci sono più informazioni su JSON qui: https://tools.ietf.org/html/rfc4627

ulteriori informazioni sulla codifica del trasferimento binario qui: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

5
sammyb123

Per completare il resto delle risposte, il tipo MIME per i dati JSON collegati (JSON-LD) secondo W3C è:

application/ld+json

Nome del tipo: application

Nome sottotipo: ld + json

Inoltre, dalla stessa fonte:

Estensione/i file :

.jsonld

5
alejnavab

Cerca sempre di ricordare questi tre tipi di contenuto anche se ci sono molti tipi di contenuto . come potresti doverli usare più frequentemente.

  • Content-Type: application/json
  • Content-Type: application/xml
  • Content-Type: text/html
1
cherankrish