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.
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:
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);
}
};
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 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
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
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
.
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 .
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 ):
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.
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!
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
.
La bonne réponse est:
Content-Type: application/json
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
“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())
}
}
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
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
_
J'utilise le ci-dessous
contentType: 'application/json',
data: JSON.stringify(SendData),
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");
Dans Spring vous avez un type défini: MediaType.APPLICATION_JSON_VALUE
qui équivaut à application/json .
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"));
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 .
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.
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.
Les développeurs PHP utilisent ceci:
<?php
header("Content-type: application/json");
// Do something here...
?>
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
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/javascript
MIME 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).
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- javascriptContent-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ètesContent-Type: text/x-json
- json avant que l'application/json soit officiellement enregistrée.
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.
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
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
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.