curso - angular wikipedia
¿Por qué HttpParams no funciona en varias líneas en angular 4.3 (5)
Desde Angular 4.3 introdujeron HttpClient en lugar de Http. en HttpClient
no puedo usar URLSearchParams
para el parámetro de consulta url. En lugar de URLSearchParams
estoy usando HttpParams
Este trabajo
var params = new HttpParams().append(''a'', ''1'').append(''b'', ''2'');
Pero por qué esto no funciona
var params = new HttpParams();
params.append(''a'', ''1'');
params.append(''b'', ''2'');
Desde la versión 5.0.0-beta.6 (2017-09-03) está disponible una nueva función ( aceptar mapa de objetos para encabezados y parámetros HttpClient ).
Ahora podemos pasar el objeto directamente en lugar de HttpParams
:
const params = {
''a'': ''1'',
''b'': ''2''
};
this.http.get(''...'', { params })
o en lugar de HttpHeaders
:
http.get(''/url'', {
headers: {''My-Header'': ''header value''}
})
El nuevo cliente HTTP trabaja con un objeto de solicitud inmutable y todas sus partes HttpParams
como HttpParams
y HttpHeaders
. Para comprender por qué, vea Por qué se solicita http y todas sus partes constitutivas, como HttpHeaders y HttpParams, son inmutables o lea el artículo Guía para expertos en interceptores y mecánica de HttpClient en Angular .
Es por eso que el método append
combina los parámetros y devuelve la nueva instancia del objeto HttpParams
combinado en cada llamada para append
:
/**
* Construct a new body with an appended value for the given parameter name.
*/
append(param: string, value: string): HttpParams {
return this.clone({param, value, op: ''a''});
}
private clone(update: Update): HttpParams {
const clone = new HttpParams({encoder: this.encoder}); <-------
clone.cloneFrom = this.cloneFrom || this;
clone.updates = (this.updates || []).concat([update]);
return clone; <--------
}
Así que aquí:
var params = new HttpParams().append(''a'', ''1'').append(''b'', ''2'');
el append
con el parámetro b
actualiza el objeto devuelto por el append
con a
parámetro.
Mientras con este enfoque
var params = new HttpParams();
params.append(''a'', ''1'');
params.append(''b'', ''2'');
el append
siempre actualiza el estado inicial de los HttpParams
y todas las operaciones de HttpParams
intermedias ignoradas de manera efectiva.
Así que tienes que usar el valor devuelto anterior:
var params = new HttpParams();
params = params.append(''a'', ''1'');
params = params.append(''b'', ''2'');
O usa el atajo con fromObject
:
let searchParams = new HttpParams({
fromObject: {
query: query,
sort: sort,
order: order
}
});
const modified = req.clone({params: searchParams});
O use el método setParams
en una solicitud directamente:
const modified = req.clone({setParams: {''query'': query, ''sort'': sort, ''order'': order}});
Además, desde la versión 5.1.x puede pasar el objeto directamente en lugar de una instancia de HttpParams:
const params = {
''a'': ''1'',
''b'': ''2''
};
this.http.get(''...'', { params })
En realidad, @Maximus hizo una buena explicación sobre la inmutabilidad del objeto HttpParams
, y todo lo que necesita es simplemente reemplazar los params
con su clon dentro del bucle.
Suponiendo que tiene cero a muchos params
disponibles, almacenados en una matriz similar a la siguiente estructura:
"params": [
{
"key": "p1",
"value": "v1"
},
{
"key": "p2",
"value": "v2"
}
]
Y de acuerdo con la información anterior, la siguiente función auxiliar debería ayudar:
export const getHttpParams = (params: Array<any>): HttpParams => {
let res = new HttpParams();
for (const item of params)
res = res.append(item.key, item.value);
return res;
};
Uso
const backend = ''http://httpstat.us/200'';
const params = getHttpParams(backend.params);
return this.http.get(`${backend}`, { params });
¡Espero eso ayude!
He intentado todas las otras formas en este post, pero tuve poco éxito. Entonces estoy encadenando params en un singleton HttpParams
y llamando a toString()
para devolver un tipo de string
. Luego puedo pasar eso a http.get()
y todo parece estar funcionando bien para construir los parámetros de URL. Aquí está mi ng -v
:
$ ng -v
_ _ ____ _ ___
/ / _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ △ / | ''_ / / _` | | | | |/ _` | ''__| | | | | | |
/ ___ /| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ /_/_| |_|/__, |/__,_|_|/__,_|_| /____|_____|___|
|___/
@angular/cli: 1.4.2
node: 8.5.0
os: linux x64
@angular/animations: 4.4.3
@angular/cdk: 2.0.0-beta.10
@angular/common: 4.4.3
@angular/compiler: 4.4.3
@angular/core: 4.4.3
@angular/forms: 4.4.3
@angular/http: 4.4.3
@angular/material: 2.0.0-beta.10
@angular/platform-browser: 4.4.3
@angular/platform-browser-dynamic: 4.4.3
@angular/router: 4.4.3
@angular/cli: 1.4.2
@angular/compiler-cli: 4.4.3
@angular/language-service: 4.4.3
typescript: 2.3.4
Aquí hay un ejemplo que está funcionando bien para mí:
// Simplified for example (I''m using Redux and won''t go into all that)
private downloadState = { requestType: ''Auction'', fileType: ''CSV'' };
getStuffFromApi(): Observable<any> {
const { requestType, fileType } = this.downloadState;
const apiRoot = ''http://www.example.com'';
const params: string = new HttpParams()
.set(''RequestType'', requestType)
.set(''FileType'', fileType)
.set(''AuctionType'', auctionType)
.set(''BackorderDay'', backorderDay)
.toString();
return this.http.get(apiRoot, { params })
.map(res => res.json())
.catch(err => Observable.of(err.json()));
}
Para que esto funcione
var params = new HttpParams();
params.append(''a'', ''1'');
params.append(''b'', ''2'');
Esto tiene que ser cambiado a
var params = new HttpParams();
params = params.append(''a'', ''1'');
params = params.append(''b'', ''2'');
Se puede enlazar y agregar dinámicamente.