web-dev-qa-db-fra.com

Quel est le type de contenu JSON correct?

Je m'amuse avec JSON depuis un certain temps, je le répète simplement sous forme de texte et ça ne fait de mal à personne (à ma connaissance), mais j'aimerais commencer à faire des choses correctement.

J'ai vu donc de nombreuses "normes" supposées pour le type de contenu JSON:

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

Mais lequel est correct ou meilleur? Je suppose que la sécurité et les problèmes de support des navigateurs varient entre eux.

Je sais qu'il existe une question similaire, Quel type MIME si JSON est renvoyé par une API REST?, mais je voudrais une réponse un peu plus ciblée.

9828
Oli

Pour le texte JSON:

application/json

Le type de support MIME pour le texte JSON est application/json. Le codage par défaut est UTF-8. (Source: RFC 4627 ).

Pour JSONP (javascript exécutable) avec rappel:

application/javascript

Voici quelques articles de blog mentionnés dans les commentaires pertinents.

9854
Gumbo

IANA a enregistré le type MIME officiel pour JSON en tant que application/json.

Quand on lui a demandé pourquoi, pas _text/json_, Crockford semble avoir dit que JSON n’était pas vraiment du JavaScript ni du texte. IANA était également plus susceptible de distribuer _application/*_ que _text/*_.

Davantage de ressources:

1574
gnrfan

Pour JSON:

Content-Type: application/json

Pour JSON-P :

Content-Type: application/javascript
849
Alix Axel

Bien entendu, le type de support MIME correct pour JSON est application/json, mais il est nécessaire de savoir quel type de données est attendu dans votre application.

Par exemple, j'utilise Ext GWT et la réponse du serveur doit aller comme text/html mais contient des données JSON.

côté client, écouteur de formulaire 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");
    }
});

En cas d'utilisation du type de réponse application/json , le navigateur me suggère de sauvegarder le fichier.

Extrait de code source côté serveur utilisant 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);
    }
};
619
Mikhail.Mamaev

JSON:

La réponse est une donnée générée dynamiquement, en fonction des paramètres de requête transmis dans l'URL.

Exemple:

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

Content-Type:application/json


JSON-P:

JSON avec un rembourrage. La réponse est constituée de données JSON, entourées d’un appel de fonction.

Exemple:

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

Content-Type:application/javascript

457
Bhavin

Si vous utilisez Ubuntu ou Debian et que vous distribuez des fichiers .json via Apache, vous pouvez proposer ces fichiers avec le type de contenu approprié. Je le fais principalement parce que je veux utiliser l'extension Firefox JSONView

Le module Apache mod_mime vous aidera à le faire facilement. Cependant, avec Ubuntu, vous devez éditer le fichier /etc/mime.types et ajouter la ligne

application/json json

Puis redémarrez Apache:

Sudo service Apache2 restart
393
Gourneau

Si vous appelez les services Web ASP.NET à partir du côté client, vous devez utiliser application/json pour que cela fonctionne. Je crois que c'est la même chose pour les frameworks jQuery et Ext .

378
markvpc

Le bon type de contenu pour JSON est application/json SAUF si vous utilisez JSONP , également appelé JSON avec Padding, qui est en fait du code JavaScript. Le type de contenu approprié est donc application/javascript.

301
Resist Design

Il ne fait aucun doute que application/json est le meilleur type MIME pour une réponse JSON.

Mais j’avais déjà eu l’occasion d’utiliser application/x-javascript à cause de problèmes de compression. Mon environnement d'hébergement est un hébergement partagé avec GoDaddy . Ils ne me permettent pas de changer les configurations du serveur. J'avais ajouté le code suivant à mon fichier web.config pour la compression des réponses.

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

En utilisant cela, les pages .aspx étaient compressées avec g-Zip mais pas les réponses JSON. J'ai ajouté

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

dans les sections types statiques et dynamiques. Mais cela ne compresse pas du tout les réponses JSON.

Après cela, j'ai supprimé ce type nouvellement ajouté et ajouté

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

dans les sections types statique et dynamique, et a changé le type de réponse dans

.ashx (gestionnaire asynchrone) à

application/x-javascript

Et maintenant, j'ai trouvé que mes réponses JSON étaient compressées avec g-Zip. Donc, je recommande personnellement d'utiliser

application/x-javascript

uniquement si vous souhaitez compresser vos réponses JSON sur un environnement d'hébergement partagé . Parce que dans l'hébergement partagé, ils ne vous permettent pas de modifier les configurations IIS .

289
shashwat

Lorsque vous utilisez application/json comme MIME , j'ai le texte suivant (à compter de novembre 2011, avec les versions les plus récentes de Chrome, Firefox avec Firebug ):

  • Plus d'avertissements de Chrome lorsque le JSON est chargé à partir du serveur.
  • Firebug ajoutera un onglet à la réponse indiquant les données JSON formatées. Si le type MIME est différent, il apparaîtra simplement comme "Contenu de la réponse".
264
Ivo Limmen

Tout ne fonctionne pas pour le type de contenu application/json.

Si vous utilisez Ext JS soumettre le fichier à télécharger, sachez que la réponse du serveur est analysée par le navigateur pour créer le document pour le <iframe>.

Si le serveur utilise JSON pour envoyer l'objet de retour, l'en-tête Content-Type doit être défini sur text/html pour que le navigateur insère le texte sans modification dans le corps du document.

Voir documentation de l'API Ext JS 3.4. .

239
Conan

JSON est un langage spécifique au domaine (DSL) et un format de données indépendant de JavaScript. En tant que tel, il a son propre type MIME , application/json. Le respect des types MIME est bien sûr axé sur le client. Par conséquent, text/plain peut être utilisé pour le transfert d'octets, mais vous risqueriez alors de pousser inutilement l'interprétation vers le domaine d'application du fournisseur - application/json. Souhaitez-vous transférer XML via text/plain?

Mais honnêtement, votre choix du type MIME indique au client comment interpréter les données - text/plain ou text/HTML (quand ce n'est pas du HTML), c'est comme effacer du type - c'est aussi peu informatif que de faire toute votre objets de type Objet dans un langage typé.

Je ne connais aucun runtime de navigateur prenant un document JSON et le mettant automatiquement à la disposition du runtime en tant qu'objet accessible par JavaScript sans intervention, mais si vous travaillez avec un client endommagé, il en va tout autrement. Mais ce n'est pas toute l'histoire— RESTful Les services JSON n'ont souvent pas d'exécution JavaScript, mais cela ne les empêche pas d'utiliser JSON comme format d'échange de données viable. Si les clients sont paralysés ... alors je considérerais peut-être une injection HTML via un service de templates Ajax .

Application/JSON!

223
VLostBoy

Si vous vous trouvez dans un environnement côté client, il est indispensable de mener une enquête sur la prise en charge inter-navigateurs pour une application Web bien prise en charge.

Le type de contenu HTTP approprié serait application/json, comme d'autres déjà mis en évidence, mais certains clients ne le gèrent pas très bien, c'est pourquoi jQuery recommande le paramètre par défaut text/html.

206

La bonne réponse est:

Content-Type: application/json
165
Irfan DANISH

Comme beaucoup d'autres l'ont mentionné, application/json est la bonne réponse.

Mais ce qui n'a pas encore été expliqué, c'est ce que signifient les autres options que vous avez proposées.

  • application/x-javascript: Type MIME expérimental pour JavaScript avant que application/javascript ne devienne standard.

  • text/javascript: Maintenant obsolète. Vous devez utiliser application/javascript lorsque vous utilisez javascript.

  • text/x-javascript: Type MIME expérimental pour la situation ci-dessus.

  • text/x-json: Le type MIME expérimental pour JSON avant que application/json ne soit officiellement enregistré.

Dans l'ensemble, chaque fois que vous avez des doutes sur les types de contenu, vous devriez vérifier ce lien

163
fcm

Dans JSP , vous pouvez utiliser cette directive dans la page:

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

Le type de média MIME correct pour JSON est application/json. JSP l'utilisera pour envoyer une réponse au client.

146
raja

application/json” est le type de contenu JSON correct.

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

Le enregistrement IANA pour application/json indique

Applications utilisant ce type de support: JSON a été utilisé pour échanger des données entre des applications écrites dans tous les langages de programmation suivants: ActionScript, C, C #, Clojure, ColdFusion, Common LISP, E, Erlang, Go, Java, JavaScript, Lua, Objective. CAML, Perl, PHP, Python, Rebol, Ruby, Scala et Scheme.

Vous remarquerez que IANA.org ne répertorie aucun de ces autres types de média , en fait même application/javascript est maintenant obsolète. Donc, application/json est vraiment la seule réponse possible correcte .

Le support du navigateur est une autre chose.

Les types de supports non standard les plus largement pris en charge sont text/json ou text/javascript. Mais certains grands noms utilisent même text/plain.

Plus étrange encore est l'en-tête Content-Type envoyé par Flickr, qui renvoie JSON sous la forme text/xml. Google utilise text/javascript pour certains de ses fichiers ajax apis.

Exemples:

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

Sortie: Content-Type: text/javascript

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

Sortie: Content-Type: text/xml

105
user1596138

Le bon type MIME est application/json

MAIS

J'ai rencontré de nombreuses situations dans lesquelles le type de navigateur ou l'utilisateur d'infrastructure avait besoin:

_text/html

application/javascript
_
87
LombaX

J'utilise le ci-dessous

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

L'en-tête Content-Type doit être réglé sur 'application/json' lors de la publication. Le serveur à l'écoute de la requête doit inclure "Accepter = application/json". Au printemps MVC, vous pouvez le faire comme ceci:

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

Ajouter des en-têtes à la réponse:

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

Dans Spring vous avez un type défini: MediaType.APPLICATION_JSON_VALUE qui équivaut à application/json .

58
Chand Priyankara

Le application/json fonctionne très bien dans PHP pour stocker un tableau ou des données d'objet.

J'utilise ce code pour mettre des données en JSON sur Google Cloud Storage (GCS) qui est défini visible publiquement :

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

Pour récupérer les données, rien de plus simple:

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

Pour JSON, j'utilise:

 Content-Type: application/json

Ceci est décrit dans la proposition du format d'échange de données JSON 7158 de l'IETF, Section 1.2: Spécifications de JSON .

49
Mehmet_

Si le JSON est avec remplissage, il s'agira de application/jsonp. Si le JSON est sans remplissage, il s'agira de application/json.

Pour traiter les deux, il est recommandé d'utiliser: 'application/javascript' sans se soucier de savoir si c'est avec ou sans remplissage.

49
Ankit Zalani

Extension des réponses acceptées lorsque vous utilisez JSON dans un contexte REST ...

Il existe un argument fort relatif à l'utilisation de application/x-resource+json et application/x-collection+json lorsque vous représentez REST ressources et collections.

Et si vous décidez de suivre la spécification jsonapi , vous devriez utiliser application/vnd.api+json, comme il est documenté.

Bien qu’il n’existe pas de norme universelle, il est clair que l’ajout de sémantique aux ressources transférées justifie un Content-Type plus explicite que application/json.

Suite à ce raisonnement, d'autres contextes pourraient justifier un plus spécifique Content-Type.

42
jgomo3

Les développeurs PHP utilisent ceci:

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

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

Si vous obtenez des données de REST API en JSON, vous devez utiliser 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

Les formats JSON (notation d'objet JavaScript) et JSONP ("JSON avec padding") semblent très similaires et il pourrait donc être très confus de quel type MIME ils se devrait utiliser. Même si les formats sont similaires, il existe quelques différences subtiles entre eux.

Donc, chaque fois que j'ai des doutes, j'ai une approche très simple (qui fonctionne parfaitement dans la plupart des cas), à savoir aller vérifier le document RFC correspondant.

JSONRFC 4627 (Le type de support application/json pour la notation d'objet JavaScript (JSON)) est une spécification de JSON format. Dans la section 6, il est indiqué que le type de support MIME pour le texte JSON est

application/json.

JSONP JSONP ("JSON avec remplissage") est traité différemment du JSON, dans un navigateur. JSONP est traité comme un script JavaScript standard et doit donc utiliser application/javascript, le type MIME officiel actuel pour JavaScript. Toutefois, dans de nombreux cas, le type text/javascriptMIME fonctionnera également.

Notez que text/javascript a été marqué comme obsolète par le document RFC 4329 (Types de supports de script) et qu'il est recommandé d'utiliser le type application/javascript. Cependant, pour des raisons héritées, text/javascript est toujours largement utilisé et prend en charge plusieurs navigateurs (ce qui n’est pas toujours le cas avec le type application/javascript MIME, en particulier avec les anciens navigateurs).

24
Iresha Rubasinghe

Content-Type: application/json - json
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - javascript
Content-Type: text/javascript - javascript MAIS obsolètes, les anciennes versions IE étaient utilisées comme attribut HTML.
Content-Type: text/x-javascript - Types de supports JavaScript MAIS obsolètes
Content-Type: text/x-json - json avant que l'application/json soit officiellement enregistrée.

23
Kashif Solangi

Pour spécifier le résultat JSON intéressant, vous ajoutez "application/json" dans l'en-tête de votre requête, comme ci-dessous:

"Accepter: application/json" est le format de réponse souhaité.

"Content-Type: application/json" spécifie le format de contenu de votre demande, mais vous spécifiez parfois à la fois application/json et application/xml, mais leur qualité peut être différente. Quel serveur enverra les différents formats de réponse, regardez l'exemple:

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

Cela renverra XML, car XML a une qualité supérieure.

7
behzad babaei

La norme actuelle correcte est application/json. Bien que le codage par défaut soit UTF-8, il convient de mentionner qu’il pourrait également s’agir de UTF-16 ou d’utf-32. Lorsque JSON est écrit en UTF-16 ou UTF-32, le codage de transfert de contenu binaire doit être utilisé.

Il y a plus d'informations sur json ici: https://tools.ietf.org/html/rfc4627

plus d'informations sur le codage de transfert binaire ici: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

6
sammyb123

Pour compléter le reste des réponses, le type MIME pour les données liées JSON (JSON-LD) selon W3C est:

application/ld+json

Nom du type: application

Nom du sous-type: ld + json

De plus, de la même source:

Extension (s) de fichier :

.jsonld

6
alejnavab

Essayez toujours de vous souvenir de ces trois types de contenu même s’il existe plusieurs types de conten . vous devrez peut-être les utiliser plus fréquemment.

  • Type de contenu: application/json
  • Type de contenu: application/xml
  • Type de contenu: text/html
3
cherankrish