¿Cuál es el tipo de contenido JSON correcto?
He estado jugando con JSON durante algún tiempo, simplemente empujándolo 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 así que 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 correcto, o mejor? Deduzco que hay problemas de seguridad y soporte del navegador que varían entre ellos.
Sé que hay una pregunta similar, Qué tipo MIME si JSON está siendo devuelto por una API REST?, pero me gustaría una respuesta un poco más específica.
30 answers
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 entradas de blog que se mencionaron en los comentarios que son relevantes.
-
Por qué no debe usar
text/html
para JSON -
Internet Explorer a veces tiene problemas con
application/json
(FECHA DE FALLECIMIENTO 2018-06-26) - Una lista bastante completa de tipos Mime y para qué usarlos
- La lista oficial de tipos mime en IANA de la respuesta de @gnrfan a continuación
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-01 05:13:59
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 IANA era más probable que repartiera application/*
que text/*
.
Más recursos:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-17 20:53:54
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:35:38
Por supuesto, el tipo de medio MIME correcto para JSON es application/json
, pero es necesario darse cuenta de qué tipo de datos se espera en su aplicación.
Por ejemplo, utilizo Ext GWT y la respuesta del servidor debe ir como text/html pero contiene datos JSON.
Lado del cliente, Ext GWT form listener
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 el tipo de respuesta application/json, el navegador me sugiere guardar el archivo.
Fragmento de código fuente del lado del servidor 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);
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 22:37:14
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 }
Contenido-Tipo: application/json
JSON-P:
JSON con relleno. La respuesta es datos JSON, con una llamada a función envuelta alrededor de ella.
Ejemplo:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Contenido-Tipo: application/javascript
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 13:09:43
Si está usando Ubuntu o Debian y sirve .archivos json a través de Apache, es posible que desee servir los archivos con el tipo de contenido correcto. Hago esto principalmente porque quiero usar la extensión de Firefox JsonView
El módulo de Apache mod_mime ayudará a hacer esto fácilmente. Sin embargo, con Ubuntu necesita editar el archivo /etc/mime.escribe y añade la línea
application/json json
Luego reinicia Apache:
sudo service apache2 restart
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-30 16:56:26
Si estás llamando ASP.NET Servicios Web desde el lado del cliente tienes que usar application/json
para que funcione. Creo que esto es lo mismo para los marcos jQuery y Ext.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:38:18
El tipo de contenido correcto para JSON es application/json
A MENOS que esté 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
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:39:25
No hay duda de que application/json
es el mejor tipo MIME para una respuesta JSON.
Pero tuve cierta experiencia en la que tuve que usar application/x-javascript
debido a algunos problemas de compresión. Mi entorno de alojamiento es el alojamiento compartido con GoDaddy . No me permiten cambiar las configuraciones del servidor. Había agregado el siguiente código a mi archivo web.config
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"/>
Usando esto, el .aspx pages fue comprimido con g-zip pero las respuestas JSON no lo fueron. Me añadido
<add mimeType="application/json" enabled="true"/>
En las secciones 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ático y dinámico, y cambió el tipo de respuesta en
.ashx (controlador asíncrono) a
application/x-javascript
Y ahora encontré que mis respuestas JSON estaban comprimidas con g-zip. Así que personalmente recomiendo usar
application/x-javascript
Solo si quieres comprime tus respuestas JSON en un entorno de alojamiento compartido . Porque en el alojamiento compartido, no le permiten cambiar las configuraciones de IIS.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 08:31:59
Solo cuando se utiliza application/json
como el tipo MIME 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 muestra los datos JSON formatear. Si el tipo MIME es diferente, se mostrará como "Contenido de respuesta".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-25 15:52:33
No todo funciona para el tipo de contenido application/json
.
Si está utilizando Ext JS form submit to upload file, tenga en cuenta que la respuesta del servidor es analizada por el navegador para crear el documento para el <iframe>
.
Si el servidor está usando JSON para enviar el objeto devuelto, entonces el encabezado Content-Type
debe estar configurado en text/html
para indicar al navegador que inserte el texto sin cambios en el cuerpo del documento.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-02 15:53:02
JSON es un lenguaje específico del dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propio tipo MIME, application/json
. El respeto por los tipos MIME es, por supuesto, impulsado por el cliente, por lo que text/plain
puede hacer para la transferencia de bytes, pero entonces estaría empujando hacia arriba la interpretación al dominio de 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 al cliente sobre cómo interpretar los datos - text/plain
o text/HTML
(cuando no es HTML) es como el borrado de tipo - es tan poco informativo como hacer que todos sus objetos de tipo sean Objeto en un lenguaje escrito.
Ningún tiempo de ejecución del navegador que yo sepa 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 inválido, eso es un asunto completamente diferente. Pero esa no es toda la historia - RESTful Los servicios JSON a menudo no tienen tiempos de ejecución JavaScript, pero no les impide usar JSON como un formato de intercambio de datos viable. Si los clientes son tan lisiados... entonces consideraría quizás la inyección HTML a través de un servicio de plantillas Ajax en su lugar.
Application / JSON!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-11 16:48:17
Si está en un entorno del lado del cliente, investigar sobre el soporte entre navegadores es obligatorio para una aplicación web bien soportada.
El tipo de contenido HTTP correcto sería application/json
, como otros ya han resaltado, pero algunos clientes no lo manejan muy bien, por eso jQuery recomienda el predeterminado text/html
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-23 15:37:55
La respuesta correcta es:
Content-Type: application/json
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-22 11:11:31
Como muchos otros han mencionado, application/json
es la respuesta correcta.
Pero lo que aún no se ha explicado es lo que significan las otras opciones que propuso.
application/x-javascript
: El tipo MIME experimental para JavaScript antes deapplication/javascript
se hizo estándar.text/javascript
: Ahora obsoleto. Debe usarapplication/javascript
cuando use javascript.text/x-javascript
: Tipo MIME experimental para la situación anterior.text/x-json
: Tipo MIME experimental para JSON antes deapplication/json
se registró oficialmente.
Con todo, siempre que tengas dudas sobre los tipos de contenido, debes revisar este enlace
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 20:05:26
En JSP , puede usar esta directiva en la página:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
El tipo de medio MIME correcto para JSON esapplication/json
. JSP lo utilizará para enviar una respuesta al cliente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-05 07:08:05
"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())
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-25 17:59:57
El IANA registro para application/json
dice
Las aplicaciones que utilizan este tipo de medio: JSON se ha utilizado para intercambiar datos entre aplicaciones escritas en todas ellas 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.
Te darás cuenta de que IANA.org no lista ninguno de estos otros medios tipos , de hecho incluso application/javascript
es ahora obsoleto. Así que application/json
es realmente la única respuesta correcta posible.
El soporte del navegador es otra cosa.
Los tipos de medios no estándar más soportados son text/json
o 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 utiliza text/javascript
para algunas de sus api 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 15:49:49
El tipo MIME correcto es application/json
PERO
Experimenté muchas situaciones en las que el tipo de navegador o el usuario del framework necesitaban:
text/html
application/javascript
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-25 17:59:47
Utilizo el siguiente
contentType: 'application/json',
data: JSON.stringify(SendData),
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 09:52:13
El encabezado Content-Type debe establecerse en ' application/json' al publicar. El servidor que escucha la solicitud debe incluir " Accept=application/json". En Spring MVC puedes hacerlo así:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Agregue encabezados a la respuesta:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 10:49:18
En Spring tiene un tipo definido: MediaType.APPLICATION_JSON_VALUE
que es equivalente a application/json.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-10 22:17:11
El
application/json
funciona muy bien en PHP para almacenar una matriz u objeto datos.
Uso este código para poner datos en JSON en Almacenamiento en la nube de Google (GCS) que se establece públicamente visible :
$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"));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 02:33:44
Si el JSON es con relleno entonces será application/jsonp
. Si el JSON está sin relleno entonces será application/json
.
Para tratar con ambos, es una buena práctica usar: 'application/javascript' sin molestarse si es con relleno o sin relleno.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-10 22:16:37
Para JSON, estoy usando:
Content-Type: application/json
Esto se describe en la propuesta del IETF JSON Data Interchange Format 7158, Sección 1.2: Especificaciones de JSON.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-02 04:03:22
Los desarrolladores de PHP usan esto:
<?php
header("Content-type: application/json");
// Do something here...
?>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-19 21:49:42
Extender las respuestas aceptadas, cuando se está utilizando JSON en un contexto REST...
Hay un argumento fuerte sobre usar application/x-resource+json
y application/x-collection+json
cuando está representando recursos y colecciones REST.
Y si decide seguir la especificación jsonapi, debe usar application/vnd.api+json
, como está documentado.
Aunque no hay un estándar universal, está claro que la semántica añadida a los recursos que se transfieren justifica una más explicit Content-Type than just application/json
.
Siguiendo este razonamiento, otros contextos podrían justificar un Tipo de contenido más específico.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 00:57:23
Si obtiene datos de la API REST en JSON, debe usar 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 08:44:40
Los formatos JSON (Notación de objetos JavaScript) y JSONP ("JSON con relleno") parecen ser muy similares y, por lo tanto, podría ser muy confuso qué tipo MIME deberían usar. Aunque los formatos parecen ser muy similares, hay algunas diferencias sutiles entre ellos.
Así que cada vez que en cualquier duda, tengo un enfoque muy simple (que funciona perfectamente encontrar en la mayoría de los casos), a saber, ir y comprobar RFC correspondiente documento.
JSON RFC 4627 (application/json Media Type for JavaScript Object Notation (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 que JSON, en un navegador. JSONP se trata como un script JavaScript regular y por lo tanto debe usar application/javascript,
el tipo MIME oficial actual para JavaScript. Sin embargo, en muchos casos, text/javascript
El tipo MIME también funcionará bien.
Tenga en cuenta que text/javascript
ha sido marcado como obsoleto por RFC 4329 (Scripting Media Types) documento y se recomienda utilizar application/javascript
tipo en su lugar. Sin embargo, debido a razones heredadas, text/javascript
todavía se usa ampliamente y tiene soporte para navegadores cruzados (lo que no siempre es un caso con el tipo MIME application/javascript
, especialmente con navegadores más antiguos).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 03:20:43
Content-type: application/json
- json
Content-Type: application/javascript
- json-P
Content-type: application/x-javascript
- javascript
Content-type: text/javascript
- javascript PERO obsoleto, versiones más antiguas de IE se utilizan como atributo html.
Content-type: text/x-javascript
- Tipos de medios JavaScript PERO obsoletos
Content-type: text/x-json
- json antes de la aplicación / json se registró oficialmente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 00:12:50