2017-12-13 4 views
-1

Ich habe Problem bekam mit Benutzerinformationen über http Anfrage an meine Ruhe api-Server bekommen, ich weiß nicht, was falsch ist ....Angular HTTP Request Probleme

Wenn Benutzer klicken Sie auf Login-Button, Angular Sendeauftrag zu Server mit Benutzername und Passwort, wenn es korrekt ist, gibt es Benutzerinformationen zurück, sonst gibt es null zurück. Problem ist, dass der variable Benutzer im Benutzerdienst immer noch null ist, obwohl der Benutzername und das Passwort korrekt sind.

Ich weiß nicht, wie man dieses Problem löst, also wenn Sie mir helfen, werde ich glücklich sein! Danke für jede Hilfe.

REST API:

package cz.flay.fellcms.http; 

import cz.flay.fellcms.dao.UsersRepository; 
import cz.flay.fellcms.entities.User; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.*; 

@CrossOrigin 
@RestController 
@RequestMapping(path = "/api/users") 
public class UsersRestController { 

    @Autowired 
    private UsersRepository usersRepository; 
    Logger logger = LoggerFactory.getLogger(UsersRestController.class); 

    @CrossOrigin 
    @GetMapping(path = "/all") 
    public @ResponseBody Iterable<User> getAll(){ 
     return usersRepository.findAll(); 
    } 

    @CrossOrigin 
    @GetMapping(path = "/verify", params = {"username", "password"}) 
    public @ResponseBody User verify(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password){ 
     logger.info("t"); 
     return usersRepository.verify(username, password); 
    } 
} 

User Service

import { Injectable } from '@angular/core'; 
import { HttpClient } from '@angular/common/http'; 
import { User } from '../entities/User'; 

@Injectable() 
export class UserService { 

    private usersUrl: 'http://localhost:8080/api/users'; 

    user: User; 
    verifyUrl: string; 

    constructor(private http: HttpClient) {} 

    isLoggedIn() { 
    return this.user != null; 
    } 

    isAdmin() { 
    return this.user.isAdmin; 
    } 

    unLoggin() { 
    this.user = null; 
    } 

    login(username: string, password: string) { 
    this.verifyUrl = 'http://localhost:8080/api/users/verify?username=' + username + '&password=' + password; 
    this.http.get<User>(this.verifyUrl).subscribe(data => this.user = data); 
    if (this.user != null) { 
     return true; 
    } else { 
     return false; 
    } 
    } 

} 
+1

Mögliche Duplikate von [eckig 2, wie Daten von abonnieren] (https://stackoverflow.com/questions/39295854/angular-2-how-to-return-data-from-subscribe) – jonrsharpe

+1

Oder verschiedene andere mit verschiedene Winkel. ** HTTP-Methoden sind asynchron **, daher die Verwendung von Observablen und die Notwendigkeit, ".subscribe" zu verwenden. Bitte lesen Sie https://angular.io/guide/http – jonrsharpe

+1

Auch das ist alles falsch. Verschieben Sie http-Material zu einem Dienst. Verschieben Sie Benutzername und Pwd zu Körper, nicht URL. Speichern Sie sie nicht, auch nicht lokal auf diesem 'verifyUrl'. Holen Sie sich diesen REST-Service RESTfull. Usw. usw. – Zlatko

Antwort

0

Sie if (this.user !== null) zu früh anrufen. Diese Auswertung wird aufgerufen, bevor die Anfrage weg und zurück geht. Versuchen Sie folgendes:

login(username: string, password: string) { 
    this.verifyUrl = `http://localhost:8080/api/users/verify?username=${username}&password=${password}`; 
    return this.http.get<User>(this.verifyUrl) 
     .map(data => { 
      this.user = data 
      if (this.user != null) { 
       return true; 
      } else { 
       return false; 
      } 
     }); 
} 

Die Sache ist aber, wo immer Sie diese login Methode aufrufen, jetzt ist es eine beobachtbare Sie zu abonnieren, nicht eine Synchronisierungsmethode.