48

我在 Angular 2 中编写了以下代码:

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

当我打印我在控制台中得到的响应时: 在此处输入图像描述

我想在代码中访问响应中的正文字段。“body”字段以下划线开头,表示它是私有字段。当我将其更改为 'console.log(res._body)' 时出现错误。

你知道任何可以在这里帮助我的getter函数吗?

4

12 回答 12

61

两者RequestResponse扩展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()方法。使用 a{responseType: 'text'}应该返回 a String

于 2017-04-13T14:14:39.793 回答
20

这是一个使用内置Response的angular2 访问响应正文的示例

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)})

  }
}
于 2017-08-05T05:39:53.603 回答
11

下面是一个gethttp 调用的例子:

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,以防你需要它们而你没有它们。

于 2017-04-13T13:57:41.693 回答
5

我也有同样的问题,这对我有用,试试:

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);
  })
于 2018-03-22T12:55:01.973 回答
5

响应数据采用 JSON 字符串形式。应用程序必须通过调用 response.json() 将该字符串解析为 JavaScript 对象。

  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

于 2017-04-13T14:08:18.113 回答
4

你不能直接引用_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;
            });

工作的笨蛋

于 2017-04-13T13:54:08.177 回答
4
.subscribe(data => {   
            console.log(data);
            let body:string = JSON.parse(data['_body']);`
于 2017-12-08T13:37:59.790 回答
4

不幸的是,许多答案只是表明如何将 Response 的正文作为text访问。默认情况下,响应对象的主体是文本,而不是通过流传递的对象。

您要查找的是 Response 对象上 Body 对象属性的 json() 函数。MDN 比我解释得更好:

Body mixin的json()方法接受一个 Response 流并将其读取完成。它返回一个 Promise,该 Promise 解析为将正文文本解析为 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() 函数的情况下,数据,尤其是在尝试访问 Response 对象的 _body 属性时,将作为文本返回,如果您正在寻找一个深层对象(如在一个对象中),这显然不是您想要的具有属性,或者不能简单地转换为另一个对象)。

响应对象示例

于 2017-09-29T14:45:07.560 回答
0

以下一个适用于所有版本的 Angular:

let body = JSON.parse(JSON.stringify(response)).body;
于 2021-05-21T09:48:12.563 回答
0

您可以尝试使用 HttpResponse @angular/common/http。

subscribe((res: HttpResponse<any>) => { console.log(res.body) })

不要忘记导入import { HttpResponse } from '@angular/common/http';

于 2021-06-05T14:46:33.187 回答
-2

这对我来说是 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();
});
于 2018-09-11T08:59:28.230 回答
-3

这应该有效。如果它是 json 响应,您可以使用 response.json() 获取正文。

   this.http.request('http://thecatapi.com/api/images/get?format=html&results_per_page=10').
      subscribe((res: Response.json()) => {
        console.log(res);
      })
于 2017-12-11T05:21:34.460 回答