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?
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 })
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¶m2=value2
O:
const params = new HttpParams({
fromString: `param1=${var1}¶m2=${var2}`
});
//http://localhost:3000/test?paramvalue1=1¶m2=value2
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
}
})
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})
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.
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.
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!
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