it-swarm-es.com

¿Cuál es el tipo de contenido JSON correcto?

He estado jugando con JSON por un tiempo, solo lo he escrito como texto y no ha hecho daño a nadie (que yo sepa), pero me gustaría empezar a hacer las cosas correctamente.

He visto entonces 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? Entiendo que hay problemas de seguridad y soporte de navegador que varían entre ellos.

Sé que hay una pregunta similar,¿Qué tipo de MIME si JSON está siendo devuelto por una REST API?, pero me gustaría una respuesta un poco más específica.

9670
Oli

Para texto JSON:

application/json

El tipo de medio MIME para el texto JSON esapplication/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 fueron mencionadas en los comentarios que son relevantes.

9674
Gumbo

IANA ha registrado el tipo MIME oficial para JSON comoapplication/json.

Cuando se le preguntó acerca de por qué no text/json, Crockford parece haber dicho que JSON no es realmente JavaScript ni texto y que IANA tenía más probabilidades de entregar application/* que text/*.

Más recursos:

1557
gnrfan

Para JSON:

Content-Type: application/json

Para JSON-P :

Content-Type: application/javascript
833
Alix Axel

Por supuesto, el tipo de medio MIME correcto para JSON es application/json, pero es necesario saber qué tipo de datos se esperan en su aplicación.

Por ejemplo, uso Ext GWT y la respuesta del servidor debe ir como text/html pero contiene datos JSON.

Lado del cliente, oyente de forma 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 el tipo de respuesta application/json, el navegador me sugiere guardar el archivo.

Fragmento de código fuente del lado del servidor utilizando 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);
    }
};
610
Mikhail.Mamaev

JSON:

La respuesta es 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 de ellos.

Ejemplo:

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

Tipo de contenido: application/javascript

452
Bhavin

Si está utilizando 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. Lo hago principalmente porque quiero usar la extensión de Firefox JSONView

El módulo Apache mod_mime ayudará a hacer esto fácilmente. Sin embargo, con Ubuntu necesita editar el archivo /etc/mime.types y agregar la línea

application/json json

Luego reinicie Apache:

Sudo service Apache2 restart
387
Gourneau

Si está llamando a los servicios web ASP.NET desde el lado del cliente, tiene que usar application/json para que funcione. Creo que esto es lo mismo para jQuery y Ext frameworks.

372
markvpc

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 y por lo tanto, el tipo de contenido correcto sería application/javascript.

296
Resist Design

No hay duda de que application/json es el mejor MIME type para una respuesta JSON.

Pero tenía algo de experiencia en la que tenía que usar application/x-javascript debido a algunos problemas de compresión. Mi entorno de alojamiento es alojamiento compartido con GoDaddy . No me permiten cambiar las configuraciones del servidor. Había añadido el siguiente código a mi archivo web.config para comprimir las 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 quité 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 (manejador asíncrono) 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 . Debido a que en el alojamiento compartido, no le permiten cambiar las configuraciones IIS .

285
shashwat

Solo cuando uso application/json como MIME type tengo lo siguiente (a partir de noviembre de 2011 con las versiones más recientes de Chrome, Firefox con Firebug ):

  • No hay más advertencias de Chrome cuando el JSON se carga desde el servidor.
  • Firebug agregará una pestaña a la respuesta que muestra los datos JSON formateados. Si el tipo MIME es diferente, solo aparecerá como "Contenido de respuesta".
259
Ivo Limmen

No todo funciona para el tipo de contenido application/json.

Si está utilizando Ext JS form submit 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 encabezado Content-Type debe configurarse en text/html para que el navegador inserte el texto sin modificar en el cuerpo del documento.

Consulte la documentación de la API Ext JS 3.4.0 .

234
Conan

JSON es un lenguaje específico del dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propio MIME tipo, application/json. Por supuesto, el respeto por los tipos MIME está impulsado por el cliente, por lo que text/plain se puede hacer para la transferencia de bytes, pero entonces usted estaría impulsando la interpretación hacia el 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 o text/HTML (cuando no es HTML) es como borrar el tipo; .

No sé, el tiempo de ejecución del navegador tomará un documento JSON y lo pondrá a disposición automáticamente como un objeto accesible a JavaScript sin intervención, pero si está trabajando con un cliente paralizado, es un asunto completamente diferente. Pero esa no es toda la historia: RESTful Los servicios JSON a menudo no tienen tiempos de ejecución de JavaScript, pero no les impide utilizar JSON como un formato de intercambio de datos viable. Si los clientes están tan lisiados ... entonces consideraría quizás la inyección de HTML a través de un servicio de plantillas Ajax en su lugar.

Aplicación/JSON!

219
VLostBoy

Si se encuentra en un entorno del lado del cliente, es obligatorio investigar sobre la compatibilidad con varios navegadores para obtener una aplicación web con un buen soporte.

El tipo de contenido HTTP correcto sería application/json, ya que otros también están resaltados, pero algunos clientes no lo manejan muy bien, por eso jQuery recomienda el text/html predeterminado.

203

La respuesta correcta es:

Content-Type: application/json
161
Irfan DANISH

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: el tipo MIME experimental para JavaScript antes de application/javascript se convirtió en estándar.

  • text/javascript: Ahora obsoleto. Debes usar application/javascript cuando uses javascript.

  • text/x-javascript: tipo MIME experimental para la situación anterior.

  • text/x-json: tipo MIME experimental para JSON antes de que application/json se registre oficialmente.

En definitiva, siempre que tenga dudas sobre los tipos de contenido, debe consultar este enlace

158
fcm

En JSP , puede usar esto en la directiva de página:

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

El tipo correcto MIME media para JSON es application/json. JSP lo usará para enviar una respuesta al cliente.

141
raja

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

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á que IANA.org no muestra ninguno de estos otros tipos de medios , de hecho, incluso application/javascript ahora está obsoleto. Entonces application/json es realmente el único correcto respuesta posible.

El soporte del navegador es otra cosa.

Los tipos de medios no estándar más compatibles son text/json o text/javascript. Pero algunos nombres importantes 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 algunas de las apis de 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

101
Jhawins

El tipo MIME correcto esapplication/json

PERO

Experimenté muchas situaciones donde el tipo de navegador o el usuario del framework necesitaban:

text/html

application/javascript
84
LombaX

Yo uso el siguiente

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

El encabezado Tipo de contenido debe establecerse en ' application/json ' al publicar. El servidor que escucha la solicitud debe incluir " Aceptar = aplicación/json ". En Spring MVC puedes hacerlo así:

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

Agregar encabezados a la respuesta:

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

En Spring tienes un tipo definido: MediaType.APPLICATION_JSON_VALUE que es equivalente a application/json .

56
Chand Priyankara

El application/json funciona muy bien en PHP para almacenar una matriz u datos de objeto.

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"));
56
Chetabahana

Para JSON, estoy usando:

 Content-Type: application/json

Esto se describe en la propuesta de IETF sobre el formato de intercambio de datos JSON 7158, Sección 1.2: Especificaciones de JSON .

48
Mehmet_

Si el JSON está con relleno, será application/jsonp. Si el JSON está sin 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.

48
Ankit Zalani

Extendiendo las respuestas aceptadas, cuando está utilizando JSON en un REST contexto ...

Hay un argumento fuerte sobre el uso de application/x-resource+json y application/x-collection+json cuando estás representando REST recursos y colecciones.

Y si decide seguir el jsonapi especificación, debe usar application/vnd.api+json, como está documentado.

Aunque no hay un estándar universal, está claro que la semántica agregada a los recursos que se transfieren justifica un Content-Typemás explícito que solo application/json.

Siguiendo este razonamiento, otros contextos podrían justificar un Content-Typemás específico.

41
jgomo3

Los desarrolladores de PHP usan esto:

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

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

Si obtiene datos de REST API 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
38
Krishna

Los formatos de JSON (notación de objetos de JavaScript) y JSONP ("JSON con relleno") parecen ser muy similares y, por lo tanto, puede ser muy confuso qué tipo de MIME deberían usar. Aunque los formatos son similares, hay algunas diferencias sutiles entre ellos.

Por lo tanto, siempre que tenga dudas, 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.

JSONRFC 4627 (La aplicación/json Media Type para la notación de objetos de 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.

JSONPJSONP ("JSON con relleno") se maneja de forma diferente a JSON, en un navegador. JSONP se trata como un script de JavaScript normal y, por lo tanto, debe usar application/javascript,, el tipo MIME oficial actual para JavaScript. En muchos casos, sin embargo, text/javascript tipo MIME también funcionará bien.

Tenga en cuenta que text/javascript ha sido marcado como obsoleto por RFC 4329 (Scripting Media Types) y se recomienda usar el tipo application/javascript en su lugar. Sin embargo, debido a razones heredadas, text/javascript todavía se usa ampliamente y tiene compatibilidad con varios navegadores (lo que no siempre es un caso con application/javascript tipo MIME, especialmente con navegadores más antiguos).

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 PERO obsoleto, las versiones más antiguas IE se usan para usar como atributo html.
Content-Type: text/x-javascript - Tipos de medios de JavaScript PERO obsoletos
Content-Type: text/x-json - json antes de que la aplicación/json se registrara oficialmente.

23
Kashif Solangi

Para especificar el interesante resultado JSON, agregue "application/json" en el encabezado de su solicitud como se muestra a continuación:

"Aceptar: aplicación/json" es un formato de respuesta deseado.

"Content-Type: application/json" especifica el formato de contenido de su solicitud, pero a veces usted especifica tanto application/json como application/xml, pero la calidad de estos puede ser diferente. El servidor que devolverá los diferentes formatos de respuesta, mire el ejemplo:

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

Esto devolverá XML, porque XML tiene mayor calidad.

6
behzad babaei

El estándar actual correcto es application/json. Si bien la codificación predeterminada es UTF-8, vale la pena mencionar que también podría ser UTF-16 o utf-32. Cuando JSON se escribe en UTF-16 o UTF-32, se debe utilizar la codificación de transferencia de contenido binario.

Hay más información sobre json aquí: https://tools.ietf.org/html/rfc4627

más información sobre la codificación de transferencia binaria aquí: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

5
sammyb123

Para complementar el resto de las respuestas, el tipo MIME para los datos vinculados JSON (JSON-LD) según W3C es:

application/ld+json

Nombre del tipo: application

Nombre del subtipo: ld + json

Adicionalmente, de la misma fuente:

Extensión (s) de archivo :

.jsonld

5
alejnavab

Siempre intente recordar estos tres tipos de contenido, aunque hay muchos tipos de contenido . ya que puede que tenga que usar estos con más frecuencia.

  • Tipo de contenido: aplicación/json
  • Tipo de contenido: aplicación/xml
  • Tipo de contenido: texto/html
1
cherankrish