Angular2 API services that wrap Http. See full client and server example ng2-api-examples
npm i --save ng2-api
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
export function authenticated(): boolean {
return !!localStorage.getItem('token');
}
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate() {
if (authenticated()) { return true; }
// Navigate to the login page
this.router.navigate(['/login']);
return false;
}
}
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { ApiHttp } from 'ng2-api';
import { authenticated } from './auth.guard';
@Injectable()
export class AuthService {
user: Object;
authenticated: boolean = authenticated();
constructor(protected http: ApiHttp,
protected router: Router) {
try {
this.user = JSON.parse(localStorage.getItem('profile'));
} catch(e) {
this.user = {};
}
}
login(params: any) {
return this.http.post('login', JSON.stringify(params))
.subscribe((res: Response) => {
let {token, user} = res.json();
let {token, user} = {token: 'abc', user: params};
localStorage.setItem('profile', JSON.stringify(user));
this.http.config.token = token;
this.authenticated = true;
this.user = user;
this.router.navigate(['/admin/posts']);
});
}
logout() {
localStorage.removeItem('profile');
this.http.config.token = '';
this.authenticated = false;
this.user = null;
this.router.navigate(['/login']);
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule, Http } from '@angular/http';
import { FormsModule } from '@angular/forms';
import { ApiConfig, ApiHttp } from './ng2-api';
import { AppComponent } from './app.component';
import { AuthService } from './shared/auth.service';
import { PostsComponent } from './posts/posts.component';
import { PostsService } from './posts/posts.service';
import { routing } from './app.routing';
@NgModule({
imports: [
BrowserModule,
HttpModule,
FormsModule,
routing
],
declarations: [
AppComponent,
PostsComponent,
],
providers: [
{
provide: ApiHttp,
useFactory: (http: Http) => new ApiHttp(new ApiConfig({baseUrl: '/api'}), http),
deps: [Http]
},
AuthService,
PostsService,
],
bootstrap: [AppComponent]
})
export class AppModule {}
import { Injectable } from '@angular/core';
import { ApiService } from 'ng2-api';
export interface Post {
id?: number;
title: string;
body: string;
}
@Injectable()
export class PostsService extends ApiService<Post> {
constructor(protected http: ApiHttp) {
super(http, 'posts');
}
}
find(id: number | string): Observable<Post>
findAll(search?: any): Observable<Post[]>
create(model: Post): Observable<Post>
update(model: Post): Observable<Post>
delete(model: Post): Observable<boolean>
You can customize resource path and provide optional config to super()
.
If need, you can also overwrite ApiService public (i.e. update
) and private methods (i.e. serialize
, deserialize
)
Example:
@Injectable()
export class PostsService extends ApiService<Post> {
constructor(protected http: ApiHttp) {
super(http, 'posts', {
arrayRoot: 'posts',
objectRoot: 'post'
});
}
}
npm i
npm test
MIT