javascript - headers - xmlhttprequest put
Error "no bien formado" en Firefox al cargar el archivo JSON con XMLHttpRequest (8)
Recibo un error "no bien formado" en la consola de error de Firefox 3.0.7 cuando el JavaScript en mi página carga un archivo de texto que contiene un objeto en formato de notación de objetos JavaScript. Si el archivo no contiene nada más que el objeto JSON, produce el error. Si envuelvo el objeto en las etiquetas <document> </ document>, no produce el error. La solicitud tiene éxito de cualquier manera, así que podría ignorarla, pero no quiero que mi registro de errores se llene con estos mensajes.
Aquí hay un código de ejemplo para ilustrar el problema. Primero, el archivo "no bien formado" llamado "data.json":
{ a: 3 }
Ahora algo de código para cargar el archivo:
var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.send(null);
Lo que produce el siguiente error en la consola de error de Firefox:
no bien formado
file: //path/to/data.json Línea: 1
{a: 3}
- ^
Si data.json se modifica a esto:
<document>{ a: 3 }</document>
No hay error Supuse que se estaba quejando porque el archivo JSON simple no es un documento XML bien formado, así que intenté sobreescribir el tipo MIME antes de la llamada "enviar" para forzarlo a cargar como texto sin formato, pero eso no funcionó.
var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.overrideMimeType("text/plain");
req.send(null);
// Still produces an error!
Voy a continuar con el ajuste de mis datos JSON en un documento XML para evitar cualquier validación que XMLHttpRequest esté realizando, pero me gustaría saber si hay alguna manera de forzarlo a que cargue texto sin restricciones y no intente validarlo Alternativamente, ¿hay otro método para cargar datos además de XMLHttpRequest que pueda usarse con texto sin formato?
¿Has intentado utilizar el tipo MIME para JSON?
application/json
También puede configurar su servidor para enviar este tipo MIME automáticamente para archivos .json.
Debería ser {"a": 3} en realidad.
En primer lugar, JSON verdadero es mucho más estricto que JavaScript, y para ser JSON válido, debe tener sus claves citadas.
{ "a": 3 }
Además, como está utilizando una XMLHttpRequest desnuda, que generalmente espera recibir un resultado XML a menos que los encabezados MIME especifiquen estrictamente lo contrario.
Sin embargo, es posible que desee hacer su propia vida más fácil simplemente utilizando un marco de JavaScript como jQuery que resuma todo este problema y resuelva todos los casos desagradables.
$.getJSON("data.json",{}, function( data ){
/* # do stuff here */
});
Además, si usa tanto JSON estricto como una biblioteca para abstraerlo, cuando los navegadores comiencen a tener analizadores nativos JSON, la biblioteca podrá usarlos de forma transparente y obtener una mejora de velocidad significativa.
(Esto está programado para suceder más temprano que tarde, y cuando sucede, ¡sus usuarios obtendrán una actualización silenciosa sin esfuerzo!).
Encontré el mismo mensaje de error pero por una causa muy diferente. Después de un poco de tiempo infructuosamente cambiando el contenido de JSON, me di cuenta de que había reiniciado accidentalmente la página que se ejecutaba en el sistema de archivos local (archivo: //Users/me/Sites/mypage.html) en lugar del servidor (http: // localhost / ~ me / Sites / mypage.html).
Esto también ocurre cuando Content-Type está completamente vacío (lo que elude la detección de tipo natural).
Kent, no estoy de acuerdo.
El siguiente es JSON "válido":
{ a: 3 }
Los nombres de propiedad del objeto JavaScript NO tienen que ser cadenas.
El problema es uno de tipo MIME, no la sintaxis JSON / JavaScript.
Acabo de resolver este problema añadiendo json como "texto / javascript" a mi archivo de tipos mime de servidor web:
text/javascript js, json
El error "no bien formado" desapareció. El navegador (FireFox) asumió, incorrectamente, que el archivo .json era XML.
También estaba recibiendo el mismo mensaje de advertencia con XMLHttpRequest()
(en FireFox), al solicitar recursos marcados como Content-Type: application/json
por el servidor.
El truco para mí fue establecer explícitamente la propiedad XMLHttpRequest.responseType
en json
en el objeto de solicitud. P.ej,
var request = new XMLHttpRequest();
request.onreadystatechange = function() { ... }
...
request.open(''GET'',''https://random-domain.com/random-path'',true);
request.responseType = ''json'';
...
request.send();
Browser --- request expects a given content-type ---> Server
<-- response contains content-type ----------
Firefox mira el encabezado HTTP Content-Type . Si el encabezado de respuesta HTTP del servidor no coincide con las expectativas del código de su navegador, se quejará con este mensaje.
En mi humilde opinión, este mensaje de error podría haber sido mucho mejor, como "Esperar encabezado de tipo de contenido de respuesta ... pero encontrado ...".