Angular 2: Как получить доступ к телу ответа HTTP?

Я написал следующий код в Angular 2:

this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
      subscribe((res: Response) => {
        console.log(res);
      })

Когда я печатаю ответ, я получаю в консоли: введите описание изображения здесь

Я хочу иметь доступ в поле кода к телу в ответе. Поле "тело" начинается с символа подчеркивания, что означает, что это личное поле. Когда я меняю его на "console.log(res._body)", я получил ошибку.

Знаете ли вы какую-нибудь функцию getter, которая может помочь мне здесь?

Ответы

Ответ 1

И Request и Response расширяют Body. Чтобы получить содержимое, используйте метод text().

this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10')
    .subscribe(response => console.log(response.text()))

Этот API устарел в Angular 5. Новый класс HttpResponse<T> вместо этого имеет метод .body(). С {responseType: 'text'} который должен возвращать String.

Ответ 2

Вот пример ответа на тело ответа с использованием angular2, встроенного в Response

import { Injectable } from '@angular/core';
import {Http,Response} from '@angular/http';

@Injectable()
export class SampleService {
  constructor(private http:Http) { }

  getData(){

    this.http.get(url)
   .map((res:Response) => (
       res.json() //Convert response to JSON
       //OR
       res.text() //Convert response to a string
   ))
   .subscribe(data => {console.log(data)})

  }
}

Ответ 3

Вот пример get http-вызова:

this.http
  .get('http://thecatapi.com/api/images/get?format=html&results_per_page=10')
  .map(this.extractData)
  .catch(this.handleError);

private extractData(res: Response) {
   let body = res.text();  // If response is a JSON use json()
   if (body) {
       return body.data || body;
    } else {
       return {};
    }
}

private handleError(error: any) {
   // In a real world app, we might use a remote logging infrastructure
   // We'd also dig deeper into the error to get a better message
   let errMsg = (error.message) ? error.message :
   error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
}

Примечание .get() вместо .request().

Я хотел бы также предоставить вам дополнительные методы extractData и handleError в случае, если они вам понадобятся, и у вас их нет.

Ответ 4

Данные ответа представлены в виде строки JSON. Приложение должно проанализировать эту строку в объектах JavaScript, вызвав response.json().

  this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
  .map(res => res.json())
  .subscribe(data => {
    console.log(data);
  })

https://angular.io/docs/ts/latest/guide/server-communication.html#!#extract-data

Ответ 5

Не можете ли вы просто обратиться к объекту _body напрямую? По-видимому, он не возвращает никаких ошибок, если используется таким образом.

this.http.get('https://thecatapi.com/api/images/get?format=html&results_per_page=10')
            .map(res => res)
            .subscribe(res => {
                this.data = res._body;
            });

Рабочий плункер

Ответ 6

К сожалению, многие ответы просто указывают, как получить доступ к телу "Ответы" как текст. По умолчанию тело объекта ответа является текстом, а не объектом, поскольку он передается через поток.

То, что вы ищете, - это функция json() свойства объекта Body объекта Response. MDN объясняет это намного лучше, чем я:

Метод json() микширования Body принимает поток Response и читает его до завершения. Он возвращает обещание, которое разрешается с результатом разбора основного текста как JSON.

response.json().then(function(data) { console.log(data);});

или используя ES6:

response.json().then((data) => { console.log(data) });

Источник: https://developer.mozilla.org/en-US/docs/Web/API/Body/json

Эта функция возвращает Promise по умолчанию, но обратите внимание, что это можно легко преобразовать в Observable для последующего потребления (поток каламбура не предназначен, но отлично работает).

Без вызова функции json() данные, особенно при попытке получить доступ к свойству _body объекта Response, будут возвращены в виде текста, что явно не то, что вы хотите, если ищете глубокий объект (как в объекте со свойствами, или не может быть просто преобразован в другой объект).

Пример объектов ответа

Ответ 7

У меня тоже была такая же проблема, и это сработало для меня:

this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
  subscribe((res) => {
    let resSTR = JSON.stringify(res);
    let resJSON = JSON.parse(resStr);
    console.log(resJSON._body);
  })

Ответ 8

.subscribe(data => {   
            console.log(data);
            let body:string = JSON.parse(data['_body']);`

Ответ 9

Это работа для меня на 100%:

let data:Observable<any> = this.http.post(url, postData);
  data.subscribe((data) => {

  let d = data.json();
  console.log(d);
  console.log("result = " + d.result);
  console.log("url = " + d.image_url);      
  loader.dismiss();
});

Ответ 10

Это должно сработать. Вы можете получить тело, используя response.json(), если это ответ json.

   this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
      subscribe((res: Response.json()) => {
        console.log(res);
      })