我一直在寻找一种方法,将查询参数传递给使用新HttpClientModule
HttpClient
的API调用,但尚未找到解决方案。使用旧的Http
模块,您可以编写类似的内容。
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 })
}
这将导致对以下URL的API调用:
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
但是,新的HttpClient
get()
方法没有search
属性,所以我想知道在哪里传递查询参数?
答案 0 :(得分:167)
我最终通过get()
函数上的IntelliSense找到它。所以,我会在这里为任何正在寻找类似信息的人发布它。
无论如何,语法几乎相同,但略有不同。不需要使用URLSearchParams()
,而是需要将参数初始化为HttpParams()
,而get()
函数中的属性现在称为params
而不是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 })
}
我实际上更喜欢这种语法,因为它更多的参数不可知。我还重构了代码,使其略微缩写。
getLogs(logNamespace): Observable<any> {
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, {
params: new HttpParams().set('logNamespace', logNamespace)
})
}
多个参数
到目前为止,我找到的最好的方法是定义一个Params
对象,其中包含我想要定义的所有参数。正如@estus在下面的评论中指出的那样,This Question中有很多关于如何分配多个参数的好答案。
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 })
带条件逻辑的多个参数
我经常使用多个参数做的另一件事是允许使用多个参数而不需要它们存在于每个调用中。使用Lodash,从调用API中有条件地添加/删除参数非常简单。 Lodash或Underscores或vanilla JS中使用的确切函数可能会因您的应用程序而异,但我发现检查属性定义的效果非常好。下面的函数只传递在传递给函数的参数变量中具有相应属性的参数。
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 })
答案 1 :(得分:73)
您可以(在版本5+中)在创建HttpParamaters时使用 fromObject 和 fromString 构造函数参数来使事情变得更容易
const params = new HttpParams({
fromObject: {
param1: 'value1',
param2: 'value2',
}
});
// http://localhost:3000/test?param1=value1¶m2=value2
或:
const params = new HttpParams({
fromString: `param1=${var1}¶m2=${var2}`
});
//http://localhost:3000/test?paramvalue1=1¶m2=value2
答案 2 :(得分:9)
更简洁的解决方案:
this._Http.get(`${API_URL}/api/v1/data/logs`, {
params: {
logNamespace: logNamespace
}
})
答案 3 :(得分:8)
您可以像这样传递
let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
答案 4 :(得分:3)
使用Angular 7, 我通过使用以下内容而不使用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();
}
}
答案 5 :(得分:2)
joshrathke是对的。
在angular.io docs中写道来自@ angular / http的URLSearchParams已弃用。相反,你应该使用@ angular / common / http 中的 HttpParams。代码非常类似于joshrathke所写的内容。 对于保存在例如
之类的对象中的多个参数{
firstParam: value1,
secondParam, value2
}
你也可以
for(let property in objectStoresParams) {
if(objectStoresParams.hasOwnProperty(property) {
params = params.append(property, objectStoresParams[property]);
}
}
如果您需要继承属性,请相应地删除hasOwnProperty。
答案 6 :(得分:2)
答案 7 :(得分:1)
如果您有一个可以转换为{key: 'stringValue'}
对的对象,则可以使用此快捷方式对其进行转换:
this._Http.get(myUrlString, {params: {...myParamsObject}});
我只是喜欢传播语法!
答案 8 :(得分:-2)
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
}
});
}