【问题标题】:Updating Services from Angular 2/4 to Angular 7将服务从 Angular 2/4 更新到 Angular 7
【发布时间】:2019-03-25 21:10:07
【问题描述】:

更新服务以在 Angular 7 中运行。我有两个功能正在审查开始 - 登录功能和获取用户信息功能。

我一直在使用这些模块 从 '@angular/http' 导入 { Http, Response, RequestOptionsArgs, Headers };

我找不到有关迁移的指导。

    login(request: LoginUserRequest): Observable<LoginUserResponse> {
    var options:RequestOptionsArgs ={};
    options.headers = new Headers();
    options.headers.append("content-type", "application/x-www-form-urlencoded");
    var  actual_request:string = "grant_type=password" + 
    "&username=" + request.username + "&password=" + request.password;
    return this._http.post(this._loginUserUrl, actual_request, options)
        .map((response: Response) => <LoginUserResponse> response.json())
        .catch(this.handleError);
}


  getUserContext(): Observable<UserContextResponse> {
    var options = this.getOptionHeader();
    return this._http.get(this._users + "/current/context", options)
        .map((response: Response) => <UserContextResponse> response.json())
        .do((data) => {
            this._refreshUserContext(data);
            this._userContext = data;
            this.isuserContextReady.next(data);
        })
        .catch(this.handleError);
 }

完整服务.ts:

    import { Injectable } from '@angular/core';
import { Http, Response, RequestOptionsArgs, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/throw';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Subject } from 'rxjs/Subject';
import { LoginUserRequest, LoginUserResponse, UserContextResponse } from "./membership.messages";
import { BaseService } from "../../app/membership/membership.base-service";
import { UserProfileService } from "../../app/userprofile.service";

@Injectable()
export class MembershipService extends BaseService {
    private _loginUserUrl:string;
    private _users:string;
    public _userContext: UserContextResponse;
    loggedIn:boolean;
    public isuserContextReady: BehaviorSubject<UserContextResponse> = new BehaviorSubject<UserContextResponse>(null);
    constructor(private _http: Http,
    private _userProfileService:UserProfileService) { 
        super();
        this._loginUserUrl = this.baseurl + '/token';
        this._users = this.baseurl + '/api/users';
        var auth_token = sessionStorage.getItem('auth_token');
        this.loggedIn= (auth_token)?true:false;
    }

    getUserContext(): Observable<UserContextResponse> {
        var options = this.getOptionHeader();
      //  console.log("at get user context");
        return this._http.get(this._users + "/current/context", options)
            .map((response: Response) => <UserContextResponse> response.json())
   //     .do(data => console.log('All: ' +  JSON.stringify(data)))
            .do((data) => {
                this._userContext = data;
                this.isuserContextReady.next(data);
            })
            .catch(this.handleError);
     }

    login(request: LoginUserRequest): Observable<LoginUserResponse> {
        var options:RequestOptionsArgs ={};
        options.headers = new Headers();
        options.headers.append("content-type", "application/x-www-form-urlencoded");
        var  actual_request:string = "grant_type=password" + 
        "&username=" + request.username + "&password=" + request.password;
        return this._http.post(this._loginUserUrl, actual_request, options)
            .map((response: Response) => <LoginUserResponse> response.json())
            .catch(this.handleError);
    }

}

【问题讨论】:

  • 添加您的服务的完整代码,以便我可以重写一些向您展示如何迁移
  • Service.ts 代码:

标签: angular


【解决方案1】:

在迁移到 Angular 7 之前需要考虑的一些基本事项。

从 Angular 4 开始,Angular 被贬低为 Http 并保持 HttpClient 并进行了重大更改为 Http

import { HttpClientModule } from '@angular/common/http';

将核心模块中的HttpModule 替换为HttpClientModule

import { HttpClient, HttpHeaders } from '@angular/common/http';

constructor(private _http: HttpClient) {}

getUserContext(): Observable<UserContextResponse> {
    var options = this.getOptionHeader();
    //  console.log("at get user context");
    return this._http.get(this._users + '/current/context', options).pipe(
      tap(data => {
        this._userContext = data;
        this.isuserContextReady.next(data);
      }, catchError(err => err))
    );
  }
  • 另外,您必须将 rxjs 版本升级到 6 才能使用可管道操作符
  • httpClient 的响应默认为 JSON,因此您不必再次map to json
  • catchError 请通过此链接查看 catch 运算符https://rxjs.dev/api/operators/catchError
  • 使用HttpHeaders 而不是Headers
  • HttpClient 现在支持打字,所以您不需要在 Http 中使用 Response。在this._http.get&lt;ResponseInterface&gt;(url, options) 中定义您的响应类型
  • HttpClient 中没有RequestOptionsArgs 的接口

【讨论】:

    【解决方案2】:

    基本上,您需要使用 @angular/common/http 的新包 HttpClient(和其他)更改您的 Http 模块。您当前的代码如下所示:

    import { HttpClient, HttpResponse, httpOptions, HttpHeaders} from '@angular/common/http'; //you need to change all these imports
    
    // your 'login' method may look like this
    login(request: LoginUserRequest): Observable < LoginUserResponse > {
      const httpOptions = {
        headers: new HttpHeaders({
          'Content-Type': 'application/x-www-form-urlencoded'
        })
      };
    
      const actual_request = new FormData();
      formData.append('grant_type', 'password');
      formData.append('username', request.username);
      formData.append('password', request.password);
    
      return this._http.post(this._loginUserUrl, actual_request, httpOptions)
        .subscribe(
          (response: Response) => { < LoginUserResponse > response.json(); },
          (error: any) => { this.handleError(); }
        );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2018-01-19
      相关资源
      最近更新 更多