1
votes

L'appel post-connexion Angular8 se termine par 400

J'essaye de faire un appel de connexion au back-end Java avec le front-end Angular8. La fonctionnalité fonctionne bien dans Postman mais lance 400 dans Angular. L'appel ressemble à ceci:

POST /api/auth/login HTTP/1.1 Host: localhost:8080 Connection:
    keep-alive Content-Length: 37 Accept: application/json, text/plain,
    */* Origin: http://localhost:4200 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 
Content-Type: application/json
Referer: http://localhost:4200/login Accept-Encoding: gzip, deflate,
Accept-Language: en-US,en;q=0.9,pl;q=0.8

Quand je regarde dans la console du navigateur, ma demande ressemble à ceci:

login(username: string, password: string) {
        let headers = new HttpHeaders();
        headers.set("Content-Type", "application/x-www-form-urlencoded");
        headers.set("Accept", "application/json");
        let options = {
            headers: headers,
            params: new HttpParams()
        }
        let payload = {"username": username, "password": password};
        let response = this.http.post<any>(environment.BASE_URL+'/api/auth/login', payload, options);
        console.log(response);
        return response;
    }

Pour certaines raisons, mes en-têtes J'ai défini ne sont pas inclus et le type de contenu est par défaut "application / json", pas x-form comme je le souhaite. La charge utile est là mais les options ne le sont pas. C'est probablement la raison de l'erreur alors pourquoi mes en-têtes ne sont pas acceptés, qu'est-ce qui ne va pas ici?


1 commentaires

La méthode post renvoie un Observable. Vous devez donc vous y abonner pour le connecter. this.http.post (environment.BASE_URL + '/ api / auth / login', payload, options) .subscribe (res => console.log (res)); mais cela ne le fait pas ' t résoudre votre problème :).


3 Réponses :


4
votes

Supposez que votre backend ressemble à ceci:

public getLoginData(username: string, password: string): any {
  const data = new FormData();
  data.append('username', username);
  data.append('password', password);
  return this.http.post<any>(environment.BASE_URL + '/api/auth/login', data);
}

Essayez-le avec FormData

@RequestMapping(path = "/api/auth/login", method = RequestMethod.POST)
public Collection getLoginData(@RequestParam("username") String username, 
    @RequestParam("password") String password) {
    return this.service.getLoginData(username, password);
}


1 commentaires

Votre réponse est également presque correcte, mais les données doivent être "référencées", comme dans l'exemple ci-dessous d'Ammar



1
votes

Essayez ce code. Vous devez définir la référence à l'objet d'origine.

login(username: string, password: string) {
        let headers = new HttpHeaders();
        headers = headers.append("Content-Type", "application/x-www-form-urlencoded");
        headers = headers.append("Accept", "application/json");
        let options = {
            headers: headers,
            params: new HttpParams()
        }
        let payload = {"username": username, "password": password};
        let response = this.http.post<any>(environment.BASE_URL+'/api/auth/login', payload, options);
        console.log(response);
        return response;
}


1 commentaires

au premier coup d'œil, je ne pouvais pas voir la différence :) Si petit changement mais faire une différence. La seule chose est que la charge utile x-form doit aller à HttpParams, pas à la charge utile et cela fonctionne. Une autre façon est d'utiliser URLSearchParams comme charge utile, je pense (je n'ai pas essayé)



1
votes

Donc, un exemple vraiment fonctionnel ressemble à ceci:

login(username: string, password: string): Observable<LoggedUser> {
        let headers = new HttpHeaders();
        headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');
        headers = headers.append('Accept', 'application/json');

        let params = new HttpParams();
        params = params.set('username', username);
        params = params.set('password', password);
        const options = {
            headers,
            params
        };
        return this.http.post<LoggedUser>(environment.BASE_URL + '/api/auth/login', {}, options);
    }


0 commentaires