tutorial - ¿Cuál es el tipo de contenido JSON correcto?
json tutorial (20)
La
application/json
funciona muy bien en PHP para almacenar una matriz u datos de objetos.
Utilizo este código para poner datos en JSON en Google Cloud Storage (GCS), que se configura 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"));
He estado jugando con JSON por algún tiempo, solo lo puse como texto y no ha afectado a nadie (que yo sepa), pero me gustaría empezar a hacer las cosas correctamente.
He visto tantos 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? 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 API REST? , pero me gustaría una respuesta un poco más específica.
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
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 antes de queapplication/javascript
estándar.text/javascript
: ahora obsoleto. Debes usarapplication/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 laapplication/json
se registrara oficialmente.
En definitiva, siempre que tenga dudas sobre los tipos de contenido, debe consultar este enlace.
El registro de la IANA para la 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 lista ninguno de estos otros tipos de medios , de hecho, incluso la application/javascript
ahora está obsoleta. Entonces 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 compatibles son text/json
o text/javascript
. Pero algunos nombres grandes 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 sus 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
El tipo MIME correcto es application/json
PERO
Experimenté muchas situaciones donde el tipo de navegador o el usuario del framework necesitaban:
text/html
application/javascript
El tipo de contenido correcto para JSON es application/json
MENOS que esté usando JSONP , también conocido como JSON con Padding, que en realidad es JavaScript y, por lo tanto, el tipo de contenido correcto sería application/javascript
.
En Spring tienes un tipo definido: MediaType.APPLICATION_JSON_VALUE
que es equivalente a application / json .
Extendiendo las respuestas aceptadas, cuando está utilizando JSON en un contexto REST ...
Existe un fuerte argumento sobre el uso de application/x-resource+json
y application/x-collection+json
cuando se representan recursos y colecciones REST.
Y si decide seguir la especificación jsonapi , debe usar application/vnd.api+json
, tal como está documentado.
Si bien no existe un estándar universal, está claro que la semántica agregada a los recursos que se transfieren justifica un tipo de contenido más explícito que solo application/json
.
Siguiendo este razonamiento, otros contextos podrían justificar un tipo de contenido más específico.
La respuesta correcta es:
Content-Type: application/json
Los desarrolladores de PHP usan esto:
<?php
header("Content-type: application/json");
// Do something here...
?>
No todo funciona para la application/json
tipo de contenido application/json
.
Si está utilizando el envío de formulario Ext JS para cargar un archivo, tenga en cuenta que el navegador analiza la respuesta del servidor para crear el documento para el <iframe>
.
Si el servidor utiliza JSON para enviar el objeto de devolución, el encabezado Content-Type
debe configurarse en text/html
para indicar al navegador que inserte el texto sin modificar en el cuerpo del documento.
Consulte la documentación de la API Ext JS 3.4.0 .
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 .
Por supuesto, el tipo de medio MIME correcto para JSON es application/json
, pero es necesario darse cuenta del tipo de datos que se esperan en su aplicación.
Por ejemplo, uso Ext GWT y la respuesta del servidor debe ir como texto / 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 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);
}
};
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: 'aplicación / javascript' sin preocuparse de si es con relleno o sin relleno.
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. Estoy haciendo esto principalmente porque quiero usar la extensión JSONView Firefox
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
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
Solo cuando uso application/json
como tipo MIME 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".
Yo uso el siguiente
contentType: 'application/json',
data: JSON.stringify(SendData),
JSON formatos JSON (Notación de objetos de JavaScript) y JSONP ("JSON con relleno") parecen ser muy similares y, por lo tanto, podría ser muy confuso qué tipo de MIME deberían estar usando. Aunque los formatos parecen ser muy similares, hay algunas diferencias sutiles entre ellos.
Entonces, cuando tenga dudas, tengo un enfoque muy simple (que funciona perfectamente en la mayoría de los casos), es decir, vaya y verifique el documento RFC correspondiente.
JSON RFC 4627 (La aplicación / json Media Type para 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 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, el tipo MIME de text/javascript
también funcionará bien.
Tenga en cuenta que el text/javascript
ha sido marcado como obsoleto por el documento rfc-editor.org/rfc/rfc4329.txt (Tipos de medios de scripting) y se recomienda usar el tipo de application/javascript
lugar. Sin embargo, debido a razones heredadas, el text/javascript
todavía se usa ampliamente y tiene compatibilidad con varios navegadores (lo que no siempre es un caso con el tipo MIME de la application/javascript
, especialmente con los navegadores más antiguos).
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 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 registre oficialmente.