Parámetros de Consulta Angular 4 HttpClient


He estado buscando una manera de pasar parámetros de consulta en una llamada API con los nuevos HttpClientModule's HttpClient y aún no he encontrado una solución. Con el antiguo módulo Http escribirías algo como esto.

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

Esto daría lugar a una llamada API a la siguiente URL:

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

Sin embargo, la nueva HttpClient get() el método no tiene una propiedad search, así que me pregunto dónde pasar los parámetros de consulta?

Author: joshrathke, 2017-08-02

7 answers

Terminé encontrándolo a través del intellisense en la función get(). Tengo que amar intellisense. Así que lo publicaré aquí para cualquiera que esté buscando información similar.

De todos modos la sintaxis es casi idéntica, pero ligeramente diferente. En lugar de usar URLSearchParams() los parámetros deben inicializarse como HttpParams() y la propiedad dentro de la función get() ahora se llama params en lugar de 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 })
}

En realidad prefiero esta sintaxis como su un poco más parámetro agnósticos. Yo también refactorizar el código para hacer un poco más abreviado.

getLogs(logNamespace): Observable<any> {

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

Múltiples parámetros

Me di cuenta de lo mucho que a menudo necesito pasar varios parámetros en una consulta, así que pensé en agregar una sección sobre cómo hacerlo también. La mejor manera que he encontrado hasta ahora es definir un objeto Params con todos los parámetros que quiero definir definidos dentro. Como Estus señaló en el comentario a continuación, hay un montón de grandes respuestas en Esta Pregunta sobre cómo asignar múltiples parámetros.

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

Múltiples Parámetros con Lógica Condicional

Otra cosa que hago a menudo con múltiples parámetros es permitir el uso de múltiples parámetros sin requerir su presencia en cada llamada. Usando Lodash, es bastante simple agregar/eliminar parámetros condicionalmente de las llamadas a la API. Las funciones exactas utilizadas en Lodash o guiones bajos, o vanilla JS pueden variar dependiendo de su aplicación, pero han encontrado que la comprobación de la definición de propiedad funciona bastante bien. La función a continuación solo pasará los parámetros que tengan las propiedades correspondientes dentro de la variable parameters pasada a la función.

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 })
 119
Author: joshrathke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 05:49:20

Puede (en la versión 5+) usar los parámetros del constructor fromObject y fromString al crear HttpParamaters para hacer las cosas un poco más fáciles

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

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

O:

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

    //http://localhost:3000/test?paramvalue1=1&param2=value2
 59
Author: JayChase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 07:33:49

Una solución más concisa:

this._Http.get(`${API_URL}/api/v1/data/logs`, { 
    params: {
      logNamespace: logNamespace
    } 
 })
 5
Author: Darwayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-10 12:24:28

Puedes pasarlo así

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

 4
Author: Pradeep B P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-15 09:42:06

[2] Joshrathke tiene razón.

En angular.io docs está escrito que URLSearchParams de @angular/http está obsoleto . En su lugar debe usar HttpParams de @angular/common/http. El código es bastante similar e idéntico a lo que joshrathke ha escrito. Para múltiples parámetros que se guardan, por ejemplo, en un objeto como

{
  firstParam: value1,
  secondParam, value2
}

También podrías hacer

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

Si necesita propiedades heredadas, elimine hasOwnProperty en consecuencia.

 2
Author: Sven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-25 13:24:08

Search propiedad de tipo URLSearchParamsen RequestOptions la clase está obsoleta en angular 4. En su lugar, debe usar params propiedad de tipo URLSearchParams.

 1
Author: sanket patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-02 09:07:17

Si tiene un objeto que se puede convertir a pares {key: 'stringValue'}, puede usar este atajo para convertirlo:

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

Me encanta la sintaxis de propagación!

 0
Author: Jeremy Moritz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 13:24:46