[angular] Angular 4.3-HttpClient 설정 매개 변수

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

왜 이것이 작동하지 않습니까? ‘aaa’만 설정하고 ‘bbb’는 설정하지 않습니다.

또한 개체가 있습니다 {aaa : 111, bbb : 222} 반복하지 않고 모든 값을 설정하려면 어떻게해야합니까?

업데이트 (이것은 작동하는 것 같지만 루프를 어떻게 피할 수 있습니까?)

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



답변

5.0.0-beta.6 이전

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

5.0.0-beta.6 이후

5.0.0-beta.6 (2017-09-03) 이후 새 기능 추가 (HttpClient 헤더 및 매개 변수에 대한 개체 맵 허용)

앞으로 개체는 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})
}


답변

HttpParams는 변경 불가능합니다. setappend방법은 기존 인스턴스를 수정하지 않습니다. 대신 변경 사항이 적용된 새 인스턴스를 반환합니다.

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

이 접근 방식은 메서드 체인과 함께 잘 작동합니다.

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

… 조건으로 포장해야하는 경우 어색 할 수 있지만.

반환 된 새 인스턴스에 대한 참조를 가져 오기 때문에 루프가 작동합니다. 작동하지 않는 게시 한 코드는 작동하지 않습니다. set () 만 호출하지만 결과를 가져 오지 않습니다.

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


답변

최신 버전 @angular/common/http(5.0 이상, 모양으로 볼 때)에서는의 fromObject키를 사용 HttpParamsOptions하여 객체를 바로 전달할 수 있습니다 .

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

이것은 단지 후드 아래에서forEach 루프를 실행합니다 .

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]);
});


답변

저에게는 체인 set방식이 가장 깨끗한 방법입니다.

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


답변

몇 가지 쉬운 대안

HttpParams개체를 사용하지 않고

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

this.http.post(url, body);

HttpParams개체 사용

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

this.http.post(url, body);


답변

이를 수행하는 또 다른 옵션은 다음과 같습니다.

this.httpClient.get('path', {
    params: Object.entries(data).reduce(
    (params, [key, value]) => params.set(key, value), new HttpParams());
});


답변

HTTP Params 클래스는 불변이므로 set 메서드를 연결해야합니다.

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