Angular 5从http请求中获取正确的Observable类型(为什么它始终是Observable <object>?)

时间:2018-02-14 04:35:12

标签: angular observable angular5 angular-httpclient angular-observable

我从http.get请求中获取正确的observable类型时遇到了一些麻烦。以下是我遇到问题的功能:

getMovie(title:string, year:number): Observable<Movie> {
    const params = new HttpParams()
        .set('title', title)
        .set('year', year.toString());
    return this.http.get(this.moviePath, {params})
  }

正如您所看到的,我希望使用参数Movie'title'从我的后端api接收和观察班级'year'。问题是响应总是以类型Observable<Object>而不是Observable<Movie>返回。

我知道我可以创建一个新的Movie实例,为它提供从列表中收到的属性。问题是我的电影类具有可选的属性。这是我的电影课:

export class Movie {
  title:string;
  year?:number;
  imdb?:string;
  trailer?:string;
  reviewClip?:string;
  reviewSummary?:string;
  reviewScore:number;
  createdAt?:Date;
  bestWeek:boolean;
  bestMonth:boolean;
}

是否有人知道一种简单的方法来使回复属于Observable<Movie>而不是Observable<Object>

2 个答案:

答案 0 :(得分:3)

  

如果您使用的是 HttpClient&amp; Http ,它会自动返回   观察到。

请将您的代码修改为

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable'
import { HttpClient,HttpHeaders,HttpResponse,HttpParams } from '@angular/common/http';

import { environment } from '../../../../environments/environment';
import { Movie } from '../models/movie'


@Injectable()
export class MovieService {

  constructor(private http:HttpClient) {

   }

  getMovie(title:string, year:number) {
    const params = new HttpParams()
        .set('title', title)
        .set('year', year.toString());
    return this.http.get<Movie>(this.moviePath, {params})
  }
}
  

这将为您提供电影类型

的回复

答案 1 :(得分:2)

可能你可以尝试从json响应中进行类型转换。

一个例子

public getEmployees(): Observable<IEmployee[]> {  
        return this.http.get(this._repositoryURL)  
            .map((response: Response) =>

   { return <IEmployee[]>response.json() })  
            .catch(this.handleError);  
 }  

您的代码

getMovie(title:string, year:number): Observable<Movie> {
    const params = new HttpParams()
        .set('title', title)
        .set('year', year.toString());
    return this.http.get(this.moviePath, {params}).map((response: Response) => { return <Movie>response.json() })  
                .catch(this.handleError);
 }

 private handleError(errorResponse: Response) {  
        console.log(errorResponse.statusText);  
        return Observable.throw(errorResponse.json().error || "Server error");  
 }