Ich habe nur eine Frage bezüglich der Strukturierung und Verarbeitung von Antworten von http Anfragen innerhalb eines Dienstes. Ich bin mit Angular2.alpha46 Typoskript (Just begann es zu testen out- was ich liebe ... Ps .. Vielen Dank an alle die Menschen, die daran zu arbeiten haben und über Github beitragen)Angular2 Handhabung http Antwort
So nehmen Sie die folgenden Schritte aus:
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]))
}
}
von dieser Komponente ich meine Userservice einführen, die meine http Anfrage Haus wird der Benutzer den Service sieht wie folgt anmelden:
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);
}
}
Was ich tun möchte ist in der Lage sein, die Antwort der Anruf kehrt nach der HTTP-Anforderung zu behandeln. Wenn zum Beispiel die Benutzeranmeldeinformationen ungültig sind, gebe ich eine 401-Antwort vom Backend zurück. Meine Frage ist, wo der beste Weg ist, die Antwort zu behandeln und das Ergebnis zurück zu der Komponente zurückzuschicken, wo ich die Methode aufgerufen habe, damit ich die Ansicht manipulieren kann, um entweder die Erfolgsmeldung anzuzeigen oder eine Fehlermeldung anzuzeigen.
Im Moment in meinem Service unter Login bin ich derzeit nicht mit der Antwort Ich mache nur einen Rückruf zurück zu der ursprünglichen Komponente, aber ich denke, das ist nicht der richtige Weg, um darüber zu gehen? Kann jemand etwas Licht auf das werfen, was sie in diesem typischen Szenario tun würden? Werde ich übernehme die Antwort im ersten Parameter der abonnieren Funktion wie:
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'
}
ist einen Rückruf fein in diesem Fall oder kann dies mit einer beobachtbaren oder ein Versprechen, besser behandelt werden?
Zum Abschluss, was ich fragen, ist ... Was ist die beste Praxis die Antwort von dem HTTP-Antwort und behandeln Sie den Status im Hinblick auf die Form aus den user.service.ts zurück zum Login zu handhaben -form.component.ts
In der nächsten Version (siehe [diese begehen] (https://github.com/robwormald/angular/commit/cf338e8ec7cc8cfbe6e66eae51e271ee825c891f)) "Http" wird Fehler, wenn Sie nicht 200 Statuscodes erhalten. Für jetzt können Sie die Antwort in 'map()' behandeln, den Status dort überprüfen und einen Fehler werfen oder den Wert übergeben. –
Danke für die schnelle Antwort Eric. Cool! Ich dachte, dass und ich bin mir bewusst, dass einige Sachen noch zur Diskussion stehen ... Also nur um zu bestätigen ... Würden Sie sagen, es ist komplett zu finden, um den Antwortstatus in der Karte für jetzt zu behandeln und den Wert in einem Rückruf zu übergeben? Könnten Sie es besser machen oder genügt ein Rückruf? – Nige
Sie brauchen den Rückruf überhaupt nicht, sehen Sie meine Antwort und es wird hoffentlich Ihre Frage beantworten: D –