Tengo una simple llamada angular2 http get como la siguiente
import { Http, Response } from '@angular/http'; @Injectable() export class ServiceBase { protected resource: string; constructor(private _http: Http) { } getTnCByCountryCodeNdType(countryCode: string, tncType: string) { let url = `${CONFIG.URL}/tnc?countryCode=${country}&tnc=${tnc}`; return this._http.get(url, this.getHeader()) .map((res: Response) => { return res.json(); }); } }La respuesta de error de lo anterior cuando se recibe,
Lo intenté
this.service .getTnCByCountryCodeNdType('MY', this.tnc.toLowerCase()) .subscribe(x => { // }, (err: Response) => { error = JSON.parse(err); });donde: err es el error de respuesta;
y arrojó el error json habitual.
EXCEPCIÓN: token R inesperado en JSON en la posición 0
Para mi sorpresa
error = err.json();Funciona bien. ¿Cuál es la diferencia entre los dos y por qué falló el primero? Cualquier ayuda es apreciada
JSON.parse es una cosa de JavaScript. Analiza una cadena que contiene JSON en lo que representa esa cadena. No le pasas objetos. Claramente, su err no es una cadena.
El res y err que te da http de Angular 2 son objetos de Response , lo que dice que se deriva de Body . No puedo ver nada en los documentos de Angular 2 que diga qué es Body , pero claramente tiene una función json que devuelve el resultado de analizar los datos de respuesta como JSON. Eso no es una cosa de JavaScript, es algo de Angular. (Como se indica en el enlace anterior, está inspirado en, pero no es lo mismo que, fetch ).
JSON.parse espera una cadena con formato JSON, pero le asigna un objeto de Respuesta, que no es JSON, de ahí el error de análisis.
res.json() extrae los datos con formato JSON del objeto Response y convierte los datos en un objeto JavaScript.