新的 HTTP 客户端使用不可变的请求对象及其所有一致部分,例如 HttpParams 和 HttpHeaders。要了解为什么请参阅Why is http request and all its constituent parts like HttpHeaders and HttpParams are immutable 或阅读文章Insider’s guide into interceptors and HttpClient mechanics in Angular。
这就是为什么append 方法会在每次调用append 时合并参数并返回合并的HttpParams 对象的新实例:
/**
* 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; <--------
}
所以这里:
var params = new HttpParams().append('a', '1').append('b', '2');
append 和 b 参数更新由 append 和 a 参数返回的对象。
虽然采用这种方法
var params = new HttpParams();
params.append('a', '1');
params.append('b', '2');
append 始终更新HttpParams 的初始状态,所有中间append 操作实际上被忽略。
所以你必须使用之前的返回值:
var params = new HttpParams();
params = params.append('a', '1');
params = params.append('b', '2');
或者使用fromObject的快捷方式:
let searchParams = new HttpParams({
fromObject: {
query: query,
sort: sort,
order: order
}
});
const modified = req.clone({params: searchParams});
或者直接对请求使用setParams方法:
const modified = req.clone({setParams: {'query': query, 'sort': sort, 'order': order}});
此外,从 5.1.x 开始,您可以直接传递对象而不是 HttpParams 的实例:
const params = {
'a': '1',
'b': '2'
};
this.http.get('...', { params })