114 votes

Angular 4.3 - HttpClient set params

let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');

Pourquoi cela ne fonctionne-t-il pas ? Il ne fixe que le 'aaa' et PAS le 'bbb'.

De plus, j'ai un objet { aaa : 111, bbb : 222 }. Comment puis-je définir toutes les valeurs sans boucler ?

UPDATE (cela semble fonctionner, mais comment éviter la boucle ?)

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});

3 votes

Je suis d'accord avec vous pour dire que httpParams.set('bbb', '222'); devrait fonctionner. J'ai d'abord essayé ça et j'étais très confus. Mais remplacez cette ligne par httpParams = httpParams.set('bbb','222'); fonctionne. pour ceux qui n'en règlent que 2, la réponse en chaîne d'un autre utilisateur en dessous est également agréable.

1 votes

Utilisez simplement l'affectation (=) comme @AngelaPan l'a suggéré et vous n'avez pas besoin d'utiliser la boucle. Lisez également ce qui concerne les notions de mutable et d'immuable.

0 votes

Veuillez voter pour la fonctionnalité de mise à jour conditionnelle de l'ensemble des paramètres HttpParams : github.com/angular/angular/issues/26021

108voto

Michalis Points 46

Avant 5.0.0-beta.6

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});

Depuis la version 5.0.0-beta.6

Depuis 5.0.0-beta.6 (2017-09-03), ils ont ajouté une nouvelle fonctionnalité (accepter une carte d'objets pour les en-têtes et les paramètres de HttpClient).

A l'avenir, l'objet peut être passé directement au lieu de HttpParams.

getCountries(data: any) {
    // We don't need any more these lines
    // let httpParams = new HttpParams();
    // Object.keys(data).forEach(function (key) {
    //     httpParams = httpParams.append(key, data[key]);
    // });

    return this.httpClient.get("/api/countries", {params: data})
}

0 votes

J'utilise la version 5.2.6 et il est certain qu'il ne prend pas de dictionnaire pour les paramètres, à moins que je ne le mette explicitement dans le cas où il s'agit de any . Est-ce vraiment l'usage prévu ?

8 votes

@Gargoyle - vous pouvez juste lancer votre objet vers n'importe quel objet. { params: <any>params } pour éviter les problèmes de compilateur ts

2 votes

Les paramètres de type chaîne qui sont nuls renverront "null" et ne prend pas en charge les nombres, les booléens et les dates.

108voto

Rich Points 361

HttpParams est destiné à être immuable. L'adresse set y append Les méthodes ne modifient pas l'instance existante. Au lieu de cela, elles renvoient de nouvelles instances, avec les changements appliqués.

let params = new HttpParams().set('aaa', 'A');    // now it has aaa
params = params.set('bbb', 'B');                  // now it has both

Cette approche fonctionne bien avec le chaînage de méthodes :

const params = new HttpParams()
  .set('one', '1')
  .set('two', '2');

...bien que cela puisse être gênant si vous avez besoin d'envelopper l'un d'entre eux dans des conditions.

Votre boucle fonctionne parce que vous saisissez une référence à la nouvelle instance retournée. Le code que vous avez posté et qui ne fonctionne pas, ne fonctionne pas. Il appelle juste set() mais ne récupère pas le résultat.

let httpParams = new HttpParams().set('aaa', '111'); // now it has aaa
httpParams.set('bbb', '222');                        // result has both but is discarded

5 votes

Comment bizarre le choix d'un HttpParams inmutable, c'était le point de blocage et devrait être la réponse acceptée.

58voto

jonrsharpe Points 34770

Dans les versions plus récentes de @angular/common/http (5.0 et plus, à ce qu'il semble), vous pouvez utiliser la fonction fromObject clé de HttpParamsOptions pour passer l'objet directement à l'intérieur :

let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });

Cela fait juste un forEach boucle sous le capot mais.. :

this.map = new Map<string, string[]>();
Object.keys(options.fromObject).forEach(key => {
  const value = (options.fromObject as any)[key];
  this.map !.set(key, Array.isArray(value) ? value : [value]);
});

0 votes

Pourquoi dites-vous fromObject ? Cela peut être n'importe quel objet.

0 votes

@ChristianMatthew le constructeur de HttpParams ne peut pas prend "tout objet", il prend HttpParamsOptions. Si vous voulez dire que vous pouvez passer n'importe quel objet comme paramètres à une requête : oui, mais seulement à partir de la v5. Sinon, je ne suis pas sûr de ce que vous demandez.

0 votes

Le mot fromObject << qu'est-ce que c'est correctement

31voto

Debojyoti Points 1199

Quelques solutions de rechange faciles

Sans utiliser HttpParams Objets

let body = {
   params : {
    'email' : emailId,
    'password' : password
   }
}

this.http.post(url, body);

Utilisation de HttpParams Objets

let body = new HttpParams({
  fromObject : {
    'email' : emailId,
    'password' : password
  }
})

this.http.post(url, body);

1 votes

Cela devrait être la réponse acceptée. Simple et propre.

1 votes

Comment l'utiliser avec le script ? Si j'ai une interface typescript "AuthType" avec email/mot de passe, lorsque j'utilise fromObject avec cette interface, il se plaint que le mauvais type est utilisé ? new HttpParams({ fromObject: typedObject } génère un avertissement "Type YourCustomType is not assignable to type { [param: string]: string | readonly string[] }

1 votes

Ah, j'ai découvert qu'en utilisant new HttpParams({ fromObject: { ...typedObject } } est un moyen de contourner le problème.

23voto

Mike Kovetsky Points 645

Quant à moi, enchaîner set les méthodes sont les plus propres

const params = new HttpParams()
.set('aaa', '111')
.set('bbb', "222");

3 votes

HttpParams est immuable comme HttpHeaders, ce qui signifie que le deuxième appel .set() ne fonctionnera pas dans ce cas. Il faut le définir en une seule fois ou utiliser la méthode .append() qui assigne la sortie à une nouvelle variable comme le suggère le PO dans sa mise à jour.

2 votes

@WPalombini Je viens d'essayer le jeu de chaînage de Mike. et ça marche ! Je pense que c'est bien pour les gens qui n'ont que 2 paramètres. C'est facile à comprendre.

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