¿Cuál es el tipo de contenido JSON correcto?
Frecuentes
Visto 3,055 veces
10614
He estado jugando con JSON durante algún tiempo, simplemente lo publica como texto y no le ha hecho daño a nadie (que yo sepa), pero me gustaría empezar a hacer las cosas correctamente.
he visto so muchos supuestos "estándares" para el tipo de contenido JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Pero, ¿cuál es la correcta o la mejor? Tengo entendido que existen problemas de seguridad y compatibilidad con el navegador que varían entre ellos.
Sé que hay una pregunta similar ¿Qué tipo de MIME si una API REST devuelve JSON?, pero me gustaría una respuesta un poco más específica.
30 Respuestas
10676
Para texto JSON:
application/json
El tipo de medio MIME para texto JSON es
application/json
. La codificación predeterminada es UTF-8. (Fuente: RFC 4627).
Para JSONP (JavaScript ejecutable) con devolución de llamada:
application/javascript
Aquí hay algunas publicaciones de blog que se mencionaron en los comentarios relevantes:
Respondido el 17 de Septiembre de 20 a las 16:09
1664
IANA ha registrado el tipo MIME oficial para JSON como application/json
.
Cuando se le preguntó por qué no text/json
, Crockford parece haber dicho que JSON no es realmente JavaScript ni texto y también es más probable que IANA distribuya application/*
que text/*
.
Más recursos:
Respondido el 17 de enero de 17 a las 20:01
Se pusieron muchas cosas en el text/*
sección en los primeros días que probablemente se pondría en el application/*
sección estos días. - Trigonometría
@Rohmer: "puede" abrir cualquier cosa en un editor de texto, pero un formato binario como JPEG o Windows .exe o .zip contendrá caracteres no imprimibles que pueden romper muchos editores de texto o provocar un comportamiento no deseado. Intenta correr cat file.jpg
por ejemplo. Mientras que cualquier archivo xml o json es 100% imprimible. Así que creo que el punto de Stijn de Witt es válido, a pesar de que sí, ya es demasiado tarde para cambiar. - XP84
@ XP84 Puede abrir cualquier binario con un editor de texto en formato HEX. Y todos los diferentes personajes (los 16) son 100% imprimibles. Entonces, por esa lógica ... ¿Son todos los binarios texto? Json no es texto. Json es (advertencia: definición informal suelta más adelante) una representación de texto de un objeto (o matriz de objetos) - xDaizu
No tiene sentido la frase "un editor de texto en formato HEX". Un editor hexadecimal muestra cada byte como su valor hexadecimal, por ejemplo, el byte 1111000 como "78". Si bien puede haber algunos editores de texto que también tengan un modo de edición hexadecimal, esto no es común ni útil para nada más que para los usuarios más técnicos que realizan las tareas más técnicas. El texto, en comparación, significa ASCII o Unicode, y en texto, el byte 1111000 significa minúsculas x
personaje. No 78. JSON es texto exactamente de la misma manera que HTML (texto / html). Contiene solo caracteres de texto legibles, con un significado estructurado en ellos. - XP84
Tiendo a estar de acuerdo con Stijn de Witt. JSON está diseñado para ser visto y editado con un editor de texto. - Panu Lógica
927
contestado el 27 de mayo de 14 a las 03:05
JSONP no es realmente JSON, es una técnica para pasar un literal de objeto JavaScript - benjamin grünbaum
649
Por supuesto, el tipo de medio MIME correcto para JSON es application/json
, pero es necesario darse cuenta de qué tipo de datos se esperan en su aplicación.
Por ejemplo, yo uso GWT externo y la respuesta del servidor debe ir como text / html pero contiene datos JSON.
Lado del cliente, oyente de formulario 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 caso de usar aplicación / json tipo de respuesta, el navegador me sugiere que guarde el archivo.
Fragmento de código fuente del lado del servidor usando Primavera 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);
}
};
contestado el 04 de mayo de 15 a las 23:05
La respuesta del servidor debe ser text / html. Esto también es cierto para la variante ExtJS. - gbegley
476
JSON:
La respuesta son datos generados dinámicamente, de acuerdo con los parámetros de consulta pasados en la URL.
Ejemplo:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Tipo de contenido: application/json
JSON-P:
JSON con relleno. La respuesta son datos JSON, con una llamada de función envuelta alrededor.
Ejemplo:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Tipo de contenido: application/javascript
Respondido 01 ago 14, 14:08
La definición de JSON es incorrecta. No necesita generarse dinámicamente ni respetar los parámetros de consulta. Puede servir un archivo JSON estático. Además, la respuesta más votada tiene un enlace al RFC. - estilo
Además, JSONP pueden ser datos json asignados a una var. - jimmy kane
412
Si está utilizando Ubuntu o Debian y sirve archivos .json a través de Apache, es posible que desee entregar los archivos con el tipo de contenido correcto. Hago esto principalmente porque quiero usar la extensión de Firefox JSONVer
El módulo de Apache mod_mimo ayudará a hacer esto fácilmente. Sin embargo, con Ubuntu necesitas editar el archivo /etc/mime.tipos y agrega la línea
application/json json
Luego reinicia Apache:
sudo service apache2 restart
Respondido el 30 de junio de 14 a las 17:06
394
Si está llamando a ASP.NET Web Services desde el lado del cliente, debe usar application/json
para que funcione. Creo que esto es lo mismo para el jQuery y ext marcos.
contestado el 27 de mayo de 14 a las 03:05
jQuery parece funcionar con al menos 'application / json' y 'text / plain' ... Sin embargo, no he probado todos los demás. - Nathan
jQuery es capaz de trabajar con content-Type: text/plain
, content-Type: application/json
, content-Type: application/json; charset=UTF-8
, contentType: "application/x-www-form-urlencoded; charset=UTF-8"
- Ashraf.Shk786
313
El tipo de contenido correcto para JSON es application/json
A MENOS QUE estés usando JSONP, también conocido como JSON con relleno, que en realidad es JavaScript, por lo que el tipo de contenido correcto sería application/javascript
.
contestado el 27 de mayo de 14 a las 03:05
302
No hay duda de que application/json
es la mejor MÍMICA escriba para una respuesta JSON.
Pero tuve algo de experiencia en la que tuve que usar application/x-javascript
debido a algunos problemas de compresión. Mi entorno de alojamiento es alojamiento compartido con Ve papi. No me permiten cambiar la configuración del servidor. Había agregado el siguiente código a mi web.config
archivo para comprimir respuestas.
<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"/>
Al usar esto, las páginas .aspx se comprimieron con g-zip, pero las respuestas JSON no. yo añadí
<add mimeType="application/json" enabled="true"/>
en las secciones de tipos estáticos y dinámicos. Pero esto no comprime las respuestas JSON en absoluto.
Después de eso, eliminé este tipo recién agregado y agregué
<add mimeType="application/x-javascript" enabled="true"/>
en las secciones de tipos estáticos y dinámicos, y cambió el tipo de respuesta en
.ashx (controlador asincrónico) para
application/x-javascript
Y ahora descubrí que mis respuestas JSON estaban comprimidas con g-zip. Así que personalmente recomiendo usar
application/x-javascript
solo si desea comprimir sus respuestas JSON en un entorno de alojamiento compartido. Porque en el hosting compartido no te permiten cambiar IIS configuraciones.
respondido 09 nov., 17:08
"Así que personalmente recomiendo usar application / x-javascript" es donde esta respuesta se vuelve engañosa. Ve papi sí permitir la compresión de application/json
, Lo aprovecho en mi alojamiento compartido y no sugeriría usar un tipo de contenido diferente para habilitar la compresión de todos modos, simplemente está mal. Se puede hacer, pero seguirá siendo incorrecto. Usando diferentes tipos de contenido para soporte de navegador Una cosa es usar diferentes tipos de contenido para la compresión del lado del servidor. - usuario1596138
271
Solo cuando se usa application/json
como el MÍMICA tipo tengo lo siguiente (a partir de noviembre de 2011 con las versiones más recientes de Chrome, Firefox con Firebug):
- No más advertencias de Chrome cuando el JSON se carga desde el servidor.
- Firebug agregará una pestaña a la respuesta que le mostrará los datos JSON formateados. Si el tipo MIME es diferente, solo aparecerá como 'Contenido de respuesta'.
Respondido 25 Jul 13, 16:07
247
No todo funciona para el tipo de contenido application/json
.
Si está utilizando Ext JS enviar formulario para cargar el archivo, tenga en cuenta que el navegador analiza la respuesta del servidor para crear el documento para el <iframe>
.
Si el servidor usa JSON para enviar el objeto de retorno, entonces el Content-Type
el encabezado debe configurarse para text/html
para decirle al navegador que inserte el texto sin cambios en el cuerpo del documento.
Respondido 02 ago 13, 16:08
Las herramientas que no se adhieran a los estándares deben evitarse siempre que sea posible; usar application/json
por especificación. - one.beat.consumidor
@ one.beat.consumer, si bien eso es cierto, no es específico de los ExtJ en sí. Es una limitación del navegador (o más bien, quizás, una "medida de seguridad"). - hendy irwan
Seguramente sería mejor usar texto / sin formato para que no aplique ninguna semántica HTML al contenido que no sea HTML. ¿O los navegadores no le permiten extraer el contenido de un marco si no tiene DOM? - Sincronizacion
Para agregar más confusión: solo estoy depurando un caso similar en Samsung Galaxy Beam (Android 2.3) con el navegador predeterminado, y el iframe
parece disparar load
evento para application/javascript
, application/x-javascript
, text/javascript
, text/plain
, pero NO dispararlo por application/json
ni text/html
. A día de hoy, Android <= 2.3 representa aproximadamente el 50% de la cuota de mercado de Android. - jakub.g
230
JSON es un lenguaje específico de dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propio MÍMICA tipo, application/json
. El respeto por los tipos MIME está, por supuesto, impulsado por el cliente, por lo que text/plain
puede hacer para la transferencia de bytes, pero entonces estaría aumentando la interpretación al dominio de la aplicación del proveedor innecesariamente - application/json
. ¿Transferirías XML a través de text/plain
?
Pero honestamente, su elección del tipo MIME es un consejo para el cliente sobre cómo interpretar los datos. text/plain
or text/HTML
(cuando no es HTML) es como el borrado de tipos: es tan poco informativo como crear todos sus objetos de tipo Object en un lenguaje escrito.
Ningún tiempo de ejecución del navegador que conozca tomará un documento JSON y lo pondrá automáticamente a disposición del tiempo de ejecución como un objeto accesible de JavaScript sin intervención, pero si está trabajando con un cliente paralizado, eso es un asunto completamente diferente. Pero esa no es toda la historia Sosegado Los servicios JSON a menudo no tienen tiempos de ejecución de JavaScript, pero eso no les impide usar JSON como un formato de intercambio de datos viable. Si los clientes están tan lisiados ... entonces consideraría tal vez la inyección de HTML a través de un Ajax servicio de plantillas en su lugar.
Aplicación / JSON!
Respondido el 11 de diciembre de 14 a las 16:12
212
Si se encuentra en un entorno del lado del cliente, investigar sobre la compatibilidad con varios navegadores es obligatorio para una aplicación web con un buen soporte.
El tipo de contenido HTTP correcto sería application/json
, como otros ya destacaron también, pero algunos clientes no lo manejan muy bien, por eso jQuery recomienda el predeterminado text/html
.
Respondido 23 Feb 13, 15:02
174
La respuesta correcta es:
Content-Type: application/json
respondido 22 nov., 14:11
169
Como muchos otros han mencionado, application/json
es la respuesta correcta.
Pero lo que aún no se ha explicado es qué significan las otras opciones que propuso.
application/x-javascript
: Tipo MIME experimental para JavaScript antesapplication/javascript
se hizo estándar.text/javascript
: Ahora obsoleto. Deberías usarapplication/javascript
al usar javascript.text/x-javascript
: Tipo MIME experimental para la situación anterior.text/x-json
: Tipo MIME experimental para JSON antesapplication/json
se registró oficialmente.
En general, siempre que tenga alguna duda sobre los tipos de contenido, debe verificar este enlace
Respondido 17 ago 15, 21:08
Cuando lo hizo text/javascript
volverse obsoleto? Todavía estoy llenando documentos HTML con <script type="text/javascript" ...
etiquetas. - Aceite
En realidad, no supone ninguna diferencia para los navegadores. Es simplemente obsoleto para los estándares RFC: rfc-editor.org/rfc/rfc4329.txt - FCM
@Oli puedes soltar con seguridad type="text/javascript"
y solo hazlo <script>...</script>
al menos de acuerdo con HTML5. - TCB13
152
118
"application/json
”Es el tipo de contenido JSON correcto.
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())
}
}
Respondido 25 Feb 14, 17:02
116
EL Registro IANA para application/json
dice
Aplicaciones que utilizan este tipo de medio: JSON se ha utilizado para intercambiar datos entre aplicaciones escritas en todos estos lenguajes de programación: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala y Scheme.
Notarás que IANA.org no enumera ninguno de estos otros tipos de medios, de hecho incluso application/javascript
ahora está obsoleto. Entonces application/json
es realmente el único posible correcta responder.
La compatibilidad con el navegador es otra cosa.
Los tipos de medios no estándar más ampliamente admitidos son text/json
or text/javascript
. Pero algunos grandes nombres incluso usan text/plain
.
Aún más extraño es el encabezado Content-Type enviado por Flickr, que devuelve JSON como text/xml
. Google usa text/javascript
para algunos de sus apis ajax.
Ejemplos:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Salida: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Salida: Content-Type: text/xml
Respondido 12 Abr '18, 16:04
93
El tipo de MIME correcto es application/json
PERO
Experimenté muchas situaciones en las que el tipo de navegador o el usuario del marco necesitaba:
text/html
application/javascript
Respondido 25 Feb 14, 17:02
¿Ejemplo de tal situación? - marca amery
77
Yo uso el siguiente
contentType: 'application/json',
data: JSON.stringify(SendData),
contestado el 17 de mayo de 13 a las 10:05
69
EL Content-Type el encabezado debe establecerse en 'aplicación / json'al publicar. El servidor que escucha la solicitud debe incluir "Aceptar = aplicación / json". En Spring MVC puede hacerlo así:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Agrega encabezados a la respuesta:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Respondido 09 ago 13, 11:08
62
EL
application/json
funciona muy bien en PHP para almacenar una matriz o datos de objetos.
Utilizo este código para poner datos en JSON en Google Cloud Storage (GCS) que está configurado visible públicamente:
$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
);
Para recuperar los datos es sencillo:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Respondido el 17 de enero de 18 a las 02:01
60
In Primavera tienes un tipo definido: MediaType.APPLICATION_JSON_VALUE
que es equivalente a aplicación / json.
Respondido 10 Jul 13, 23:07
Eso es Java EE también: javax.ws.rs.core.MediaType - Eddie B
53
Para JSON, estoy usando:
Content-Type: application/json
Esto se describe en la propuesta del formato de intercambio de datos JSON 7158 del IETF, Sección 1.2: Especificaciones de JSON.
Respondido el 02 de enero de 16 a las 04:01
51
Si el JSON es con relleno, entonces será application/jsonp
. Si el JSON no tiene relleno, será application/json
.
Para lidiar con ambos, es una buena práctica usar: 'application / javascript' sin preocuparse de si es con relleno o sin relleno.
Respondido 10 Jul 13, 23:07
La primera parte de tu respuesta es incorrecta. "application / jsonp" no es un tipo MIME válido. El cuerpo de respuesta de un JSONP es solo JavaScript, por lo que se debe usar uno de los tipos MIME para JavaScript. - Rob W
45
Los desarrolladores de PHP usan esto:
<?php
header("Content-type: application/json");
// Do something here...
?>
Respondido 19 Jul 14, 22:07
45
Ampliando las respuestas aceptadas, cuando está utilizando JSON en un contexto REST ...
Hay un argumento fuerte sobre el uso application/x-resource+json
y application/x-collection+json
cuando representa recursos y colecciones REST.
Y si decides seguir el jsonapi especificación, debieras uso de application/vnd.api+json
, como está documentado.
Aunque no existe un estándar universal, está claro que la semántica agregada a los recursos que se transfieren justifica una más explícita Content-Type que solo application/json
.
Siguiendo este razonamiento, otros contextos podrían justificar un enfoque más específico. Content-Type.
Respondido 27 Jul 16, 01:07
42
Si obtiene datos de la API REST en JSON, debe usar el tipo de contenido
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
Respondido 21 Abr '16, 09:04
31
Content-Type: application/json
- json
Content-Type: application/javascript
- json-P
Content-Type: application/x-javascript
- javascript
Content-Type: text/javascript
- javascript PERO obsoleto, las versiones anteriores de IE se usaban como atributo html.
Content-Type: text/x-javascript
- Tipos de medios JavaScript PERO obsoletos
Content-Type: text/x-json
- json antes de que la aplicación / json se registrara oficialmente.
Respondido el 25 de enero de 19 a las 14:01
Para texto JSON: application / json Content-Type: application / json - vikash chauhan
31
JSON (Notación de objetos JavaScript) y JSONP Los formatos ("JSON con relleno") parecen ser muy similares y, por lo tanto, puede resultar muy confuso qué tipo de MIME deberían usar. Aunque los formatos son similares, existen algunas diferencias sutiles entre ellos.
Entonces, siempre que tenga alguna duda, tengo un enfoque muy simple (que funciona perfectamente bien en la mayoría de los casos), es decir, vaya y verifique el documento RFC correspondiente.
JSON RFC 4627 (El tipo de medio application / json para la notación de objetos JavaScript (JSON)) es una especificación del formato JSON. Dice en la sección 6, que el tipo de medio MIME para texto JSON es
application/json.
JSONP
JSONP ("JSON con relleno") se maneja de manera diferente a JSON, en un navegador. JSONP se trata como un script JavaScript normal y, por lo tanto, debe usar application/javascript,
el tipo MIME oficial actual para JavaScript. En muchos casos, sin embargo, text/javascript
El tipo MIME también funcionará bien.
Tenga en cuenta que text/javascript
ha sido marcado como obsoleto por RFC 4329 (Tipos de medios de secuencia de comandos) y se recomienda utilizar application/javascript
escriba en su lugar. Sin embargo, debido a razones heredadas, text/javascript
todavía se utiliza ampliamente y tiene soporte para varios navegadores (que no siempre es un caso con application/javascript
Tipo MIME, especialmente con navegadores más antiguos).
respondido 13 mar '19, 06:03
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas json http-headers content-type or haz tu propia pregunta.
Lista completa de tipos MIME - Eugen Mihailescu
¿realmente importa qué tipo de mimo tiene? es texto que se analiza en un objeto. ¿No sería más natural pasarlo como texto / sin formato si desea que se pueda abrir en el navegador sin forzar la descarga, y application / octet-stream si desea que se descargue automáticamente (útil si lo está generando en una página web destinada a guardarse localmente). ¿Realmente hay tanta gente que necesitará saber el tipo de mime para que el descargador pueda verlo con un visor json especial? ¿Qué me estoy perdiendo que lo justifique como un tipo de mimo especial? - Dmitry
Internet Explorer a veces tiene problemas con la aplicación / json - el blog está desconectado - kudlatiger
Imagina que tengo un documento escrito por alguien que contiene texto sin formato. Ahora, ese texto sin formato también es JSON válido. ¿Me equivocaría entonces al usar text / plain como su tipo de mimo? JSON es un SUBTIPO de texto. Entonces creo que ambos deberían estar permitidos. La pregunta es cuál funciona mejor en la práctica. Según el comentario de codetoshare, IE tiene problemas con application / json. Pero ningún navegador debería tener problemas con el texto o sin formato. Si texto / sin formato no es seguro, ¿cómo puedo servir archivos de texto desde mi sitio web? - Panu Lógica
@EugenMihailescu El título de esa página es "Lista incompleta de tipos MIME" - palo omega