65 votes

Demande POST de HttpClient utilisant x-www-form-urlencoded

J'essaye de faire une requête POST avec x-www-form-urlencoded comme suit :

login(username, password): Observable<any> {
    return this.http.post('/login', {
      username: username,
      password: password
      },
      {
        headers: new HttpHeaders()
          .set('Content-Type', 'x-www-form-urlencoded')
      }
      );

Malheureusement, mon API indique que j'ai envoyé un nom d'utilisateur et un mot de passe vides.

J'ai donc décidé d'envoyer une requête postman à mon point de connexion pour voir d'où venait le problème. La requête postman a bien renvoyé le nom d'utilisateur et le mot de passe.

Comment se fait-il que lorsque je poste depuis postman, mon API renvoie mon nom d'utilisateur et mon mot de passe et que lorsque je poste depuis mon application Angular, mon API renvoie des valeurs vides ? Est-ce qu'il y a quelque chose qui m'échappe ?

144voto

Owain van Brakel Points 1786

Vous envoyez des données JSON à l'API au lieu de données de formulaire. L'extrait ci-dessous devrait fonctionner.

login(username, password): Observable<any> {
  const body = new HttpParams()
    .set('username', username)
    .set('password', password);

  return this.http.post('/login',
    body.toString(),
    {
      headers: new HttpHeaders()
        .set('Content-Type', 'application/x-www-form-urlencoded')
    }
  );
}

1 votes

Après de nombreuses recherches, cette solution a fonctionné ! Il y a beaucoup de vieux guides qui utilisent l'ancien HttpClient... :) Merci !

2 votes

Je n'ai réussi à faire fonctionner la solution d'Owain qu'en n'effectuant pas de "toString()" sur le corps.

0 votes

Que ce dont j'ai besoin

34voto

Robert Hegner Points 1060

Il existe un moyen plus facile que les autres approches décrites ici.

C'est ce qui a fonctionné pour moi avec Angular 7 :

const payload = new HttpParams()
  .set('username', username)
  .set('password', password);

this.http.post(url, payload);

Il n'est pas nécessaire de définir explicitement l'en-tête avec cette approche.

Notez que l'objet HttpParams est immuable. Donc, si vous faites quelque chose comme ce qui suit, cela ne fonctionnera pas, vous obtiendrez un corps vide :

const payload = new HttpParams();
payload.set('username', username);
payload.set('password', password);

this.http.post(url, payload);

0 votes

Où avez-vous trouvé le contenu ?

0 votes

Il semble que le contenu et le corps soient synonymes

1 votes

Le fait que HttpParams est immuable m'a fait trébucher. J'ai mis du temps à comprendre pourquoi ça donnait un corps vide.

1voto

KielSoft Points 307

Vous pouvez aussi bien charger vos données à partir d'un objet

login(username, password): Observable<any> {
    const body = new HttpParams({
        fromObject: {
            username,
            password,
            ...extraData, // if any 
        }
    });

    return this.http.post('/login',
        body.toString(),
        {
            headers: new HttpHeaders()
                .set('Content-Type', 'application/x-www-form-urlencoded')
        }
    );
}

-1voto

Vous pouvez faire une demande de poste comme ci-dessous.

login(email:string, password:string):Observable<User>{
    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', 'application/x-www-form-urlencoded')
    let params = new HttpParams().set('user', JSON.stringify({email: email,password:password}));
    return this.http.post<User>(`${MEAT_API_AUX}/login`,
    {},{headers: headers,params:params})
        .do(user => this.user = user);
}

après cela, il faut s'abonner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X