각도 4 HttpClient 쿼리 매개 변수


147

나는 새와 API 호출에 쿼리 매개 변수를 전달할 수있는 방법을 찾고있다 HttpClientModuleHttpClient및 해결책을 찾기 위해 아직있다. 이전 Http모듈을 사용하면 다음과 같이 작성할 수 있습니다.

getNamespaceLogs(logNamespace) {

    // Setup log namespace query parameter
    let params = new URLSearchParams();
    params.set('logNamespace', logNamespace);

    this._Http.get(`${API_URL}/api/v1/data/logs`, { search: params })
}

그러면 다음 URL에 대한 API 호출이 발생합니다.

localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace

그러나 새로운 HttpClient get()메소드에는 search속성이 없으므로 쿼리 매개 변수를 어디에 전달해야하는지 궁금합니다.


2
각도 7, 당신은 객체로 PARAMS을 쓸 수와 같이 사용 : this.httpClient.get(url, { params } 체크 아웃 stackoverflow.com/a/54211610/5042169
Jun711

답변:


231

나는 get()기능 에 대한 IntelliSense를 통해 그것을 찾았습니다 . 비슷한 정보를 찾는 사람을 위해 여기에 게시하겠습니다.

어쨌든 구문은 거의 동일하지만 약간 다릅니다. URLSearchParams()매개 변수 를 사용 하는 대신 초기화해야 HttpParams()하며 get()함수 내의 특성 이 이제 params대신 호출 됩니다 search.

import { HttpClient, HttpParams } from '@angular/common/http';
getLogs(logNamespace): Observable<any> {

    // Setup log namespace query parameter
    let params = new HttpParams().set('logNamespace', logNamespace);

    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })
}

실제로이 구문은 조금 더 매개 변수에 관계없이 선호합니다. 또한 코드를 리팩토링하여 약간 더 간략하게 만들었습니다.

getLogs(logNamespace): Observable<any> {

    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, {
        params: new HttpParams().set('logNamespace', logNamespace)
    })
}

여러 매개 변수

지금까지 찾은 가장 좋은 방법은 정의 Params하려는 모든 매개 변수 를 사용하여 객체 를 정의하는 것입니다. 아래 주석에서 @estus가 지적 했듯이이 질문 에는 여러 매개 변수를 할당하는 방법에 대한 많은 대답 있습니다.

getLogs(parameters) {

    // Initialize Params Object
    let params = new HttpParams();

    // Begin assigning parameters
    params = params.append('firstParameter', parameters.valueOne);
    params = params.append('secondParameter', parameters.valueTwo);

    // Make the API call using the new parameters.
    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })

조건부 논리가있는 다중 매개 변수

여러 매개 변수로 자주 수행하는 또 다른 작업은 모든 호출에서 해당 매개 변수가 없어도 여러 매개 변수를 사용할 수 있다는 것입니다. Lodash를 사용하면 API 호출에서 매개 변수를 조건부로 추가 / 제거하는 것이 매우 간단합니다. Lodash, Underscores 또는 vanilla JS에서 사용되는 정확한 기능은 응용 프로그램에 따라 다를 수 있지만 속성 정의를 확인하는 것이 효과적이라는 것을 알았습니다. 아래 함수는 함수에 전달 된 parameters 변수 내에 해당 속성이있는 매개 변수 만 전달합니다.

getLogs(parameters) {

    // Initialize Params Object
    let params = new HttpParams();

    // Begin assigning parameters
    if (!_.isUndefined(parameters)) {
        params = _.isUndefined(parameters.valueOne) ? params : params.append('firstParameter', parameters.valueOne);
        params = _.isUndefined(parameters.valueTwo) ? params : params.append('secondParameter', parameters.valueTwo);
    }

    // Make the API call using the new parameters.
    return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, { params: params })

6
첫 번째 스 니펫이 잘못되었습니다. let params = new HttpParams(); params.set(...)예상대로 작동하지 않습니다. 참조 stackoverflow.com/questions/45459532/...
Estus 플라스크

@joshrathke 헤더와 매개 변수를 함께 추가하는 방법을 추가해 주시겠습니까?
Savad KP

3
@SavadKP 당신은 이것처럼 이것을 설정할 수 있습니다 .http.get (url, {headers : headers, params : params}); HttpParams와 같은 새로운 HttpHeaders에 대해 읽어보십시오
Junaid

I 추측은 new HttpParams({fromObject: { param1: 'value1', ... }});다음 (5 + 각도) 가장 쉬운 방법입니다 params.set(...).
Pankaj Prakash

88

HttpParamater를 만들 때 (버전 5 이상) fromObjectfromString 생성자 매개 변수를 사용하여 조금 더 쉽게 만들 수 있습니다.

    const params = new HttpParams({
      fromObject: {
        param1: 'value1',
        param2: 'value2',
      }
    });

    // http://localhost:3000/test?param1=value1&param2=value2

또는:

    const params = new HttpParams({
      fromString: `param1=${var1}&param2=${var2}`
    });

    //http://localhost:3000/test?paramvalue1=1&param2=value2

27
더 이상 필요하지 않습니다. JSON 객체를 HttpClient에 직접 전달할 수 있습니다. const params = {'key': 'value'}로 : http.get('/get/url', { params: params })
danger89

7
@ danger89 맞습니다. 그러나 string 또는 string [] 값만 허용됩니다!
호세 엔리케

내 시간을 크게 절약했습니다. 요청 URL에 쿼리 매개 변수를 문자열로 추가하여 URL을 구성하고있었습니다.
Pankaj Prakash

16

이렇게 전달할 수 있습니다

let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})

3
사실이지만 창을 입력하지 않습니다
DanLatimer

@DanLatimer 아무 것도 사용할 필요가 없으므로 입력 할 때까지 타이핑을 계속 사용할 수 있습니다.params
InDieTasten

11

더 간결한 솔루션 :

this._Http.get(`${API_URL}/api/v1/data/logs`, { 
    params: {
      logNamespace: logNamespace
    } 
 })

6

Angular 7에서는 HttpParams를 사용하지 않고 다음을 사용하여 작업했습니다.

import { HttpClient } from '@angular/common/http';

export class ApiClass {

  constructor(private httpClient: HttpClient) {
    // use it like this in other services / components etc.
    this.getDataFromServer().
      then(res => {
        console.log('res: ', res);
      });
  }

  getDataFromServer() {
    const params = {
      param1: value1,
      param2: value2
    }
    const url = 'https://api.example.com/list'

    // { params: params } is the same as { params } 
    // look for es6 object literal to read more
    return this.httpClient.get(url, { params }).toPromise();
  }
}

4

{key: 'stringValue'}쌍 으로 변환 할 수있는 개체가있는 경우이 바로 가기를 사용하여 변환 할 수 있습니다.

this._Http.get(myUrlString, {params: {...myParamsObject}});

나는 확산 구문을 좋아한다!


3

joshrathke가 옳다.

angular.io에서 문서 것으로 기록 @ 각도 / HTTP에서 URLSearchParams가되지 않습니다 . 대신 @ angular / common / http에서 HttpParams 를 사용해야합니다 . 코드는 매우 유사하며 joshrathke가 작성한 것과 동일합니다. 예를 들어 다음과 같은 객체에 저장된 여러 매개 변수의 경우

{
  firstParam: value1,
  secondParam, value2
}

당신은 또한 할 수 있습니다

for(let property in objectStoresParams) {
  if(objectStoresParams.hasOwnProperty(property) {
    params = params.append(property, objectStoresParams[property]);
  }
}

상속 된 속성이 필요한 경우 그에 따라 hasOwnProperty를 제거하십시오.


2

RequestOptions 클래스 에서 URLSearchParams 유형의 검색 속성은 각도 4에서 더 이상 사용되지 않습니다. 대신 URLSearchParams 유형의 params 속성을 사용해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.