我有一个问题,涉及到在服务中构建和处理Http请求的响应。我正在使用Angular2.alpha46 Typescript(刚开始测试它-我很喜欢它...顺便说一句,感谢所有通过Github做出贡献的人)
所以接下来看:
login-form.component.ts
import {Component, CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/angular2';
import {UserService} from '../../shared/service/user.service';
import {Router} from 'angular2/router';
import {User} from '../../model/user.model';
import {APP_ROUTES, Routes} from '../../core/route.config';
@Component({
selector: 'login-form',
templateUrl: 'app/login/components/login-form.component.html',
directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
})
export class LoginFormComponent {
user: User;
submitted: Boolean = false;
constructor(private userService:UserService, private router: Router) {
this.user = new User();
}
onLogin() {
this.submitted = true;
this.userService.login(this.user,
() => this.router.navigate([Routes.home.as]))
}
}
从这个组件中,我导入了userService
,它将包含我的登录用户的 HTTP 请求。该服务如下所示:
user.service.ts
import {Inject} from 'angular2/angular2';
import {Http, HTTP_BINDINGS, Headers} from 'angular2/http';
import {ROUTER_BINDINGS} from 'angular2/router';
import {User} from '../../model/user.model';
export class UserService {
private headers: Headers;
constructor(@Inject(Http) private http:Http) {
}
login(user: User, done: Function) {
var postData = "email=" + user.email + "&password=" + user.password;
this.headers = new Headers();
this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post('/auth/local', postData, {
headers: this.headers
})
.map((res:any) => res.json())
.subscribe(
data => this.saveJwt(data.id_token),
err => this.logError(err),
() => done()
);
}
saveJwt(jwt: string) {
if(jwt) localStorage.setItem('id_token', jwt)
}
logError(err: any) {
console.log(err);
}
}
我想做的是能够处理HTTP请求返回的响应。例如,如果用户凭据无效,则我从后端传回401响应。我的问题是,最好的方法在哪里处理响应并将结果返回给调用该方法的组件,以便我可以操纵视图来显示成功消息或显示错误消息。目前,在我的服务中,我当前没有处理响应,只是回调到原始组件,但我觉得这不是正确的方法?有人能否介绍一下在这种典型情况下他们会怎么做?我是否应该在subscribe函数的第一个参数中处理响应,例如:
login(user: User, done: Function) {
var postData = "email=" + user.email + "&password=" + user.password;
this.headers = new Headers();
this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post('/auth/local', postData, {
headers: this.headers
})
.map((res:any) => res.json())
.subscribe(
(data) => {
// Handle response here
let responseStat = this.handleResponse(data.header)
// Do some stuff
this.saveJwt(data.id_token);
// do call back to original component and pass the response status
done(responseStat);
},
err => this.logError(err)
);
}
handleResponse(header) {
if(header.status != 401) {
return 'success'
}
return 'error blah blah'
}
在这种情况下,使用回调函数可以吗?或者使用可观察对象或承诺会更好处理?
总的来说,我的问题是...在视图中从user.service.ts返回到login-form.component.ts,如何处理http响应并处理表单的状态,这是最佳实践是什么?
Http
将在您获取非200状态代码时出错。目前,您可以在map()
中处理响应,在那里检查状态并抛出错误或传递值。 - Eric Martinezreturn http.post().map(/* 处理结果 */)
, 然后在我的组件中,我会执行this.userService.login(...).subscribe(/* 处理数据*/)
。 - Eric Martinez