example - Parámetros de consulta angular 4 HttpClient
httpclient angular 5 (9)
He estado buscando una forma de pasar parámetros de consulta a una llamada API con el nuevo
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 resultaría en una llamada API a la siguiente URL:
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
Sin embargo, el nuevo método
get()
HttpClient
no tiene una propiedad de
search
, por lo que me pregunto dónde pasar los parámetros de consulta.
Pasando múltiples parámetros con URL en Angular 7
component.ts File --
--------------------------------------------------------------------------
export class UnsubscribeComponent implements OnInit {
email: string;
token: string;
constructor(private httpSvc: HttpService) {}
ngOnInit() {
this.httpSvc.get(''pin/unsubscribe''+''?
email=''+this.email+''&tn=''+this.token).subscribe(res => {
if (res.status === this.appConstants.ResponseCodes.success) {
//Do what you want
} else {
//Do what you want
}
});
}
Con Angular 7, lo hice funcionar usando lo siguiente sin usar 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();
}
}
Puede (en la versión 5+) usar los parámetros del constructor fromObject y fromString al crear HttpParamaters para facilitar las cosas
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
Puedes pasarlo así
let param: any = {''userId'': 2};
this.http.get(`${ApiUrl}`, {params: param})
Si tiene un objeto que se puede convertir a pares
{key: ''stringValue''}
, puede usar este acceso directo para convertirlo:
this._Http.get(myUrlString, {params: {...myParamsObject}});
¡Me encanta la sintaxis extendida!
Terminé encontrándolo a través de IntelliSense en la función
get()
.
Por lo tanto, lo publicaré aquí para cualquier persona 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
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 })
}
De hecho, prefiero esta sintaxis ya que es un poco más agnóstico de parámetros. También reescribí el código para hacerlo 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)
})
}
Parámetros Múltiples
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 muchas respuestas excelentes 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 })
Parámetros múltiples con lógica condicional
Otra cosa que a menudo hago con múltiples parámetros es permitir el uso de múltiples parámetros sin requerir su presencia en cada llamada. Con Lodash, es bastante simple agregar / eliminar condicionalmente parámetros de llamadas a la API. Las funciones exactas utilizadas en Lodash o Underscores, o vanilla JS pueden variar según su aplicación, pero descubrí que verificar la definición de propiedad funciona bastante bien. La siguiente función solo pasará parámetros que tengan propiedades correspondientes dentro de la variable de parámetros 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 })
Una solución más concisa:
this._Http.get(`${API_URL}/api/v1/data/logs`, {
params: {
logNamespace: logNamespace
}
})
joshrathke tiene razón.
En angular.io docs está escrito que URLSearchParams de @ angular / http está en desuso . 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.
la propiedad de búsqueda de tipo URLSearchParams en la clase RequestOptions está en desuso en angular 4. En su lugar, debe usar la propiedad params de tipo URLSearchParams .