如何处理http请求返回的数据
How to handle returned data from http request
我是 Angular.io 的新手,我在处理来自 HTTP 请求的响应时遇到问题。
我正在尝试制作简单的登录组件。
我写了简单的服务:
@Injectable()
export class AuthService {
private url ='http://localhost:3000/user/1';
constructor(private http: Http){}
isLoggedIn: boolean = false;
user : User;
errorMessage:any;
login(username:string, password:string) {
this.getUser(username, password).subscribe((user)=>{
if(user.login===username && password===user.password){
this.isLoggedIn=true;
}
})
}
logout(): void {
this.isLoggedIn = false;
}
getUser(username:string, password:string): Observable<User>{
return (this.http.get(this.url)
.map(this.extractData)
.catch(this.handleError))
}
private extractData(res: Response){
let body = res.json();
return body || {};
}
private handleError (error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
和调用此服务的登录组件:
public Dologin() {
this.message = 'Trying to log in ...';
this.authService.login(this.model.username, this.model.password)
.subscribe(() => {
this.setMessage();
if (this.authService.isLoggedIn) {
let redirect = '/main';
let navigationExtras: NavigationExtras = {
preserveQueryParams: true,
preserveFragment: true
};
// Redirect the user
this.router.navigate([redirect], navigationExtras);
}
});
}
如您所见,我已经在身份验证服务上使用 Observable,因为我需要检查登录名和密码。现在如何修改我的 Dologin 方法来调用登录等待查询结束?喜欢 subscribe 但没有 Observable 了
首先,不要使用名为 User
的 class(我的登录字段出现错误)。例如用 MyUser
重命名。
您需要在登录函数中使用 map
而不是 subscribe
并且 return 和 Observable<MyUser>
:
login(username:string, password:string) : Observable<MyUser> {
return this.getUser(username, password).map(user => {
if(user.login===username && password===user.password){
this.isLoggedIn=true;
}
return user;
});
}
getUser(username:string, password:string): Observable<MyUser>{
return (this.http.get(this.url).map((r) => {
return r.json() as MyUser;
})
.catch(this.handleError))
}
说明:
在登录函数中,您定义了要链接的操作,但这些操作尚未执行。当 subscribe()
被调用时链将被执行。
首先,您获取用户 (http.get),然后检查 login/password。
然后,您只调用 subscribe()
一次。
我是 Angular.io 的新手,我在处理来自 HTTP 请求的响应时遇到问题。 我正在尝试制作简单的登录组件。
我写了简单的服务:
@Injectable()
export class AuthService {
private url ='http://localhost:3000/user/1';
constructor(private http: Http){}
isLoggedIn: boolean = false;
user : User;
errorMessage:any;
login(username:string, password:string) {
this.getUser(username, password).subscribe((user)=>{
if(user.login===username && password===user.password){
this.isLoggedIn=true;
}
})
}
logout(): void {
this.isLoggedIn = false;
}
getUser(username:string, password:string): Observable<User>{
return (this.http.get(this.url)
.map(this.extractData)
.catch(this.handleError))
}
private extractData(res: Response){
let body = res.json();
return body || {};
}
private handleError (error: Response | any) {
// In a real world app, you might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
和调用此服务的登录组件:
public Dologin() {
this.message = 'Trying to log in ...';
this.authService.login(this.model.username, this.model.password)
.subscribe(() => {
this.setMessage();
if (this.authService.isLoggedIn) {
let redirect = '/main';
let navigationExtras: NavigationExtras = {
preserveQueryParams: true,
preserveFragment: true
};
// Redirect the user
this.router.navigate([redirect], navigationExtras);
}
});
}
如您所见,我已经在身份验证服务上使用 Observable,因为我需要检查登录名和密码。现在如何修改我的 Dologin 方法来调用登录等待查询结束?喜欢 subscribe 但没有 Observable 了
首先,不要使用名为 User
的 class(我的登录字段出现错误)。例如用 MyUser
重命名。
您需要在登录函数中使用 map
而不是 subscribe
并且 return 和 Observable<MyUser>
:
login(username:string, password:string) : Observable<MyUser> {
return this.getUser(username, password).map(user => {
if(user.login===username && password===user.password){
this.isLoggedIn=true;
}
return user;
});
}
getUser(username:string, password:string): Observable<MyUser>{
return (this.http.get(this.url).map((r) => {
return r.json() as MyUser;
})
.catch(this.handleError))
}
说明:
在登录函数中,您定义了要链接的操作,但这些操作尚未执行。当 subscribe()
被调用时链将被执行。
首先,您获取用户 (http.get),然后检查 login/password。
然后,您只调用 subscribe()
一次。