Comment puis-je convaincre IE d'afficher simplement l'application / json plutôt que de proposer de le télécharger?

161

Lors du débogage des applications jQuery qui utilisent AJAX, j'ai souvent besoin de voir le fichier json renvoyé par le service au navigateur. Je vais donc déposer l'URL des données JSON dans la barre d'adresse.

C'est bien avec ASPNET car en cas d'erreur de codage, je peux voir le diagostic ASPNET dans le navigateur:

texte alternatif

Mais lorsque le code côté serveur fonctionne correctement et renvoie réellement JSON, IE m'invite à le télécharger, donc je ne peux pas voir la réponse.

texte alternatif

Puis-je demander à IE de NE PAS faire cela, en d'autres termes, de simplement l'afficher comme s'il s'agissait de texte brut?

Je sais que je pourrais le faire si je définis l'en-tête Content-Type sur text/plain.

Mais il s'agit spécifiquement du contexte d'une application ASPNET MVC, qui définit la réponse automatiquement lorsque j'utilise JsonResult sur l'une de mes méthodes d'action. De plus, je veux garder le type de contenu approprié et ne pas le changer uniquement pour prendre en charge les efforts de débogage.

Cheeso
la source
Firefox 3/4 fait également cela, si vous avez une machine qui n'a pas été mise à jour.
Chris S
8
J'aime l'utilisation de "convaincre" !!
adardesign

Réponses:

234

J'ai trouvé la réponse.

Vous pouvez configurer IE8 pour afficher application / json dans la fenêtre du navigateur en mettant à jour le registre. Il n'y a pas besoin d'un outil externe. Je n'ai pas testé cela de manière générale, mais cela fonctionne avec IE8 sur Vista.

Pour l'utiliser, n'oubliez pas que toutes les mises en garde habituelles concernant la mise à jour du registre s'appliquent. Arrêtez IE. Ensuite, coupez et collez ce qui suit dans un fichier, du nom de json-ie.reg.

Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.  
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;  

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

Puis double-cliquez sur le fichier .reg. Redémarrez IE. Le nouveau comportement que vous obtenez lorsque vous chatouillez une URL qui renvoie un document avec Content-Type: application/jsonou Content-Type: text/jsonressemble à ceci:

texte alternatif

Ce que ça fait, pourquoi ça marche:

Le 25336920-03F9-11cf-8FD0-00AA00686F13est le CLSID de l'action "Parcourir sur place". Fondamentalement, cette entrée de registre indique à IE que pour les documents qui ont un type d'application mime / json, affichez-le simplement en place. Cela n'affectera pas les documents d'application / json téléchargés via des <script>balises, ou via XHR, et ainsi de suite.

Les clés CLSID et encodage obtenir les mêmes valeurs utilisées pour image/gif, image/jpeget text/html.

Cet indice provient de ce site et de l'article de Microsoft sur la gestion des types MIME dans Internet Explorer .


Dans FF, vous n'avez pas non plus besoin d'un module complémentaire externe. Vous pouvez simplement utiliser le view-source:pseudo-protocole. Entrez une URL comme celle-ci dans la barre d'adresse:

view-source:http://myserver/MyUrl/That/emits/Application/json

Ce pseudo-protocole était auparavant pris en charge dans IE, également, jusqu'à WinXP-sp2, lorsque Microsoft l'a désactivé pour des raisons de sécurité.

Cheeso
la source
13
Si vous souhaitez ignorer la création du fichier de registre, voici une ligne unique que vous pouvez coller dans une fenêtre PowerShell:reg add "HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json" /t REG_SZ /d "{25336920-03F9-11cf-8FD0-00AA00686F13}"; reg add "HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json" /v Encoding /t REG_DWORD /d 0x08000000
Jason R. Coombs
2
@nathanvda, il n'est pas nécessaire de demander quoi que ce soit à la plus grande partie du monde. L'affichage de JSON dans le navigateur est quelque chose qu'un développeur d'une page AJAX voudrait faire. Il est totalement inutile d'afficher JSON dans le navigateur pour les utilisateurs réguliers.
Cheeso
3
J'ai commis l'erreur fatale de permettre à un ami d'emprunter ma boîte et il a lancé ce correctif. Quelqu'un sait-il quels sont les paramètres d'origine pour que je puisse les inverser?
KevDog
7
@Mosh, cela a été mentionné par nathanvda ci-dessus, la solution n'est pas pour que les utilisateurs du site Web puissent voir le JSON, c'est simplement à des fins de débogage. Lisez toute la question.
Anthony Shaw
2
Cela fonctionne toujours dans IE11 sur win 8.1. N'a même pas besoin de redémarrer le navigateur. Dans mon cas, j'avais besoin de la text/jsonclé.
Chris
15

J'avais un problème similaire. J'utilisais le jQuery "$. GetJSON" et tout fonctionnait parfaitement dans Firefox et Chrome.

Mais cela n'a pas fonctionné dans IE. J'ai donc essayé d'accéder directement à l'URL de json, mais dans IE, il m'a demandé si je voulais télécharger le fichier.

Après de nombreuses recherches, j'ai vu qu'il devait y avoir un en-tête dans le résultat avec un type de contenu, dans mon cas, le type de contenu était:

header("Content-type: text/html; charset=iso-8859-1");

Mais lorsque la page qui a fait la demande reçoit ce json, dans IE, vous devez être spécifié SAME CONTENT-TYPE, dans mon cas était:

$.getJSON (
"<? site_url php echo (" ajax / tipoMenu ")?>"
{contentType: 'text / html; charset = utf-8'},
function (result) {

câlins

Fillipe Silva
la source
Cela a fonctionné pour moi, aucun problème avec le registre requis, il suffit de changer l'en-tête de la réponse aussi "text / html".
64 km
2
Comment cela fonctionne-t-il dans IE7 lors d'un appel Ajax et reçoit json en conséquence? Je n'utilise pas getJSON mais plutôt un appel .ajax. J'ai utilisé ce type de contenu dans la réponse et l'en-tête et cela n'aide pas du tout. Ni l'utilisation de json2.js. Quelqu'un a-t-il des implémentations réussies de cela qui fonctionnent dans ie7? IE7 représente plus de 30% de nos utilisateurs. Triste mais vrai, et un changement de clé de registre n'est pas une option. Dire à un million d'utilisateurs du gouvernement de simplement exécuter un hack de reg ne volera pas.
CD Smith
Je sais que c'est une vieille question, mais elle est répétée, alors voici la réponse: La question d'origine concerne les DÉVELOPPEURS qui déboguent la récupération de JSON. La modification du reg est suggérée comme une étape pour aider ces développeurs. La modification du registre n'est ni recommandée ni suggérée pour les utilisateurs généraux. Aussi: il n'est JAMAIS nécessaire pour les utilisateurs réguliers (= un million d'utilisateurs gouvernementaux) de visualiser JSON dans le navigateur.
Cheeso
Utilisez simplement text/plain; charset=UTF-8. Pas besoin de texte / html.
perryflynn
13

La solution ci-dessus manquait, et le code ci-dessous devrait fonctionner dans toutes les situations:

Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.  
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;  

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/x-json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

Enregistrez-le simplement dans le fichier json.reg et exécutez pour modifier votre registre.

Tomasz Maj
la source
Mon ordinateur de travail est verrouillé. Si vous avez besoin de les ajouter en ligne de commande, consultez cette réponse. stackoverflow.com/questions/13809856/… Merci OP. Je vois json dans IE ........ yay!
grenadeCoder
2

Si vous êtes d'accord avec IE simplement ouvrir le JSON dans un bloc-notes, vous pouvez changer le programme par défaut de votre système pour les fichiers .json en Bloc-notes.

Pour ce faire, créez ou recherchez un fichier .json, cliquez avec le bouton droit de la souris et sélectionnez «Ouvrir avec» ou «Choisir le programme par défaut».

Cela peut s'avérer utile si vous souhaitez par hasard utiliser Internet Explorer mais que votre entreprise informatique ne vous laissera pas modifier votre registre. Sinon, je recommande les réponses ci-dessus.

Porschiey
la source
1

J'utilise Fiddler avec le plugin JSONViewer pour inspecter JSON. Je ne pense pas qu'il soit possible de faire fonctionner IE sans jouer avec le registre peut-être. Voici quelques informations.

Chetan S
la source
1

La modification des paramètres de type mime JSON d'IE affectera la façon dont IE traite toutes les réponses JSON.

Changer l'en-tête de type mime en text / html indiquera effectivement à n'importe quel navigateur que la réponse JSON que vous renvoyez n'est pas JSON mais du texte brut.

Aucune des deux options n'est préférable.

Au lieu de cela, vous voudrez utiliser un plugin ou un outil comme le Fiddler mentionné ci-dessus ou tout autre proxy d'inspecteur de trafic réseau où vous pouvez choisir à chaque fois comment traiter la réponse JSON.

user1632922
la source
2
text/htmln'indique pas au navigateur que la réponse est en texte brut, mais en HTML. Si vous décidez que vous voulez du texte brut, utilisez text/plain. Sinon, vous pouvez vous retrouver avec des vulnérabilités XSS intéressantes.
Michael Mior
0

FireFox + FireBug est très bon à cet effet. Pour IE, il existe une barre d'outils développeur que je n'ai jamais utilisée et que j'ai l'intention d'utiliser, je ne peux donc pas fournir beaucoup de commentaires.

Darin Dimitrov
la source
oui, je connais le plugin FF qui permet l'affichage de l'application / json sous forme de texte normal. Cependant, je veux spécifiquement en savoir plus sur IE.
Cheeso
Il existe une barre d'outils de développement pour IE. En passant, voici une belle comparaison de différents outils pour les développeurs: elegantcode.com/2009/05/18
Darin Dimitrov
0

J'ai juste eu le même problème avec un XMLHttpRequest. Le site fonctionne parfaitement dans Chrome et FF, et dans des dizaines et des dizaines de navigateurs Internet Explorer en production. Cette machine ONE (celle que notre société est en train de configurer pour être une machine de démonstration, bien sûr) a décidé qu'elle allait inviter à enregistrer la réponse json à une requête ajax.

La solution regedit acceptée ci-dessous l'a corrigé. Merci.

Kintar
la source
-1

Vous pouvez voir la réponse dans Fiddler: http://www.fiddler2.com/fiddler2/

C'est un bel outil pour de telles choses!

Asgerhallas
la source
Je connais Fiddler, mais cela semble exagéré pour quelque chose d'aussi simple.
Cheeso