Ich habe oben genannten Anwendungsfall auf diese Weise implementiert.
Ich habe ApiService
für CRUD
wie unten erstellt. Das code
ist selbsterklärend und wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen.
api-service.ts
import { Injectable, } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Headers, RequestOptions, BaseRequestOptions } from '@angular/http';
import { Storage } from '@ionic/storage';
import { Events } from 'ionic-angular';
@Injectable()
export class ApiService {
constructor(private http: Http, private storage: Storage, private events: Events) { }
createHeader(headers: Headers) {
return new Promise((resolve, reject) => {
this.storage.get('loggedInUser')
.then((token: any) => {
if (token) headers.append('Authorization', 'token ' + token.token);
resolve(headers);
}, err => {
resolve(headers);
});
});
}
get(api) {
let header = new Headers();
return Observable.fromPromise(this.createHeader(header))
.map(() => {
let options = new BaseRequestOptions();
options.withCredentials = true;
options.headers = header;
return options
})
.switchMap((options) => this.http.get(api, options))
.catch((err: Error | Response) => {
if (err instanceof Response && err.status === 401) {
this.events.publish('token-expiration');
}
return Observable.throw(err);
});
}
post(url, params): Observable<any> {
return new Observable(observer => {
let header = new Headers();
this.createHeader(header)
.then(() => {
let options = new RequestOptions({ headers: header });
this.http.post(url, params, options)
.subscribe(response => {
observer.next(response);
observer.complete();
}, (e) => {
observer.error(e);
});
})
})
}
delete(url) {
return new Observable(observer => {
let header = new Headers();
this.createHeader(header)
.then(() => {
return this.http.delete(url, { headers: header, withCredentials: true })
.subscribe(response => {
observer.next(response);
observer.complete();
});
})
});
}
}
Here I loggedInUser
Lagerung, wenn der Benutzer in das app.It angemeldet geschaffen haben, ist auch ein provider
wie unten gezeigt.
sozial login.ts
import { Injectable } from '@angular/core';
import { ApiService } from "../providers";
import { LocalCacheServiceProvider } from "../local-cache-service/local-cache-service";
import { UserService } from "../user-provider";
import { Storage } from '@ionic/storage';
@Injectable()
export class SocialLoginProvider {
constructor(private apiService: ApiService, private localCacheService: LocalCacheServiceProvider, private userService: UserService, private storage: Storage) {
}
//login To App
loginToApp(url: string, data: string) {
this.apiService.post(url, { access_token: data })
.map((res: any) => res.json())
.subscribe(res => {
this.setUserLocally(res);
});
}
//set User Locally
setUserLocally(user) {
this.localCacheService.clearAllKeys().then(() => {
this.userService.setLoggedInUser(user);
this.storage.set('loggedInUser', user);
});
}
}
Danach habe ich oben Service konsumieren kann (das heißt ApiService
) durch jede meiner provider
(für CRUD
Operationen), wie unten gezeigt.
Dies ist die ArticleService
.
Artikel-service.ts
import { Injectable } from '@angular/core';
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/map';
import { config } from '../config/config';
import { ApiService } from './api-service';
@Injectable()
export class ArticleService {
constructor(private apiService: ApiService) {
}
getBookById(id) {
return this.apiService.get(`${config.getBookById}${id}/`).map((res: any) => res.json());
}
}
Above Ansatz funktioniert für me.Hope völlig in Ordnung, dieser Ansatz Ihnen helfen too.If Sie weitere Hilfe benötigen Sie mich bitte.
Ich mag das Konzept des Erhaltens und Hinzufügens von Token aus dem API-Dienst und nicht jeder Komponente. Aber holt nicht Token direkt von der DB jedes Mal ist ein Overhead, kann ich es verwenden, um in der lokalen Variablen gespeichert einmal zu speichern? – joHN
Ich denke, das ist am besten, wenn wir die Sicherheit der App berücksichtigen. Ich kann hier kein Leistungsproblem sehen. Und auch Sie können den Token-Ablauf-Anwendungsfall gut handhaben. Siehe '.catch ((err: Fehler | Antwort) => { if (err instanceof Antwort && err.status === 401) { this.events.publish ('Token-Ablauf'); } return Observable .throw (err); }); ' – Sampath
Ja, eigentlich habe ich das' token' im 'localstorage' gespeichert, also' loggedInUser'. – Sampath