Во-первых, я должен упомянуть, что я новичок в Angular, и я как бы зациклен на своем примере кода.Обработка исключений службы REST в Angular2
Я создал небольшое приложение для входа в систему, которое запрашивает имя пользователя и пароль, вызывает службу REST для входа в систему (написанную на Java), которая возвращает некоторый токен при успешном завершении входа в систему или выдает исключение при неудаче входа в систему.
Вот некоторые из моих кодов.
Войти компонент:
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthenticationService } from '../_services/index';
@Component({
moduleId: module.id,
templateUrl: 'login.component.html'
})
export class LoginComponent implements OnInit {
model: any = {};
error = '';
constructor(
private router: Router,
private authenticationService: AuthenticationService) { }
ngOnInit() {
// reset login status
this.authenticationService.logout();
}
login() {
this.authenticationService.login(this.model.username, this.model.password)
.subscribe(result => {
if (result === true) {
this.router.navigate(['/']);
} else {
this.error = 'Login failed!';
}
},
err => {
this.error = 'Login failed!';
});
}
}
Служба аутентификации:
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '@angular/http';
import { Observable } from 'rxjs';
import { CookieService } from 'angular2-cookie/core';
import { CookieOptionsArgs } from 'angular2-cookie/services/cookie-options-args.model';
import 'rxjs/add/operator/map';
@Injectable()
export class AuthenticationService {
public token: string;
constructor(private http: Http, private cookieService: CookieService) {
// set token if saved in cookie
this.token = cookieService.get('token');
}
login(username, password): Observable<boolean> {
return this.http.post('http://localhost:9081/MyApp/login?username=' + username + '&password=' + password, new RequestOptions({}))
.map((response: Response) => {
// login successful if there's a token in the response
let token = response.text();
if (token !== '-1') {
// set token
this.token = token;
// store token in cookie to keep user logged
let opts: CookieOptionsArgs = {
path: '/'
};
this.cookieService.put('token', token, opts);
// return true to indicate successful login
return true;
} else {
// return false to indicate failed login
return false;
}
});
}
logout(): void {
// clear token, remove cookie to log user out
this.token= null;
this.cookieService.remove('token');
}
}
Все работает, как ожидалось. Когда логин будет успешным, возвращается токен, и я перенаправляется на домашнюю страницу. В противном случае на странице входа появляется сообщение «Login falied», и перенаправление не происходит. Меня беспокоит то, что я точно не знаю, почему логин завершается с ошибкой: это потому, что имя пользователя не существует или может быть, потому что пароль неправильный. Каков правильный способ обработки исключений, переданных службой REST? Я предполагаю, что проверка подлинности является правильным местом, но я точно не знаю, как это сделать. Я попытался извлечь некоторую информацию из объекта запроса, но сопоставление запросов не происходит, если выбрано исключение.
Спасибо за помощь!
В случае, если вы получаете сообщение об ошибке относительно Наблюдаемые для параметра улова, следуя поможет https://stackoverflow.com/questions/37472770/catch-is-not-working-for-http-get-angular2/37475643#37475643 – Nitin