jos*_*hke 123 http typescript lodash angular angular-httpclient
我一直在寻找一种方式来传递查询paramters与新API调用HttpClientModule
的HttpClient
,还没有找到一个解决方案.使用旧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 })
}
Run Code Online (Sandbox Code Playgroud)
这将导致对以下URL的API调用:
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
但是,新HttpClient
get()
方法没有search
属性,所以我想知道在哪里传递查询参数?
jos*_*hke 194
我最终通过get()
功能上的IntelliSense找到了它.所以,我会在这里发布给任何正在寻找类似信息的人.
无论如何,语法几乎相同,但略有不同.而不是使用URLSearchParams()
需要初始化的参数,现在调用函数中HttpParams()
的属性而不是.get()
params
search
import { HttpClient, HttpParams } from '@angular/common/http';
Run Code Online (Sandbox Code Playgroud)
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 })
}
Run Code Online (Sandbox Code Playgroud)
我实际上更喜欢这种语法,因为它更多参数不可知.我还重构了代码,使其略微缩写.
getLogs(logNamespace): Observable<any> {
return this._HttpClient.get(`${API_URL}/api/v1/data/logs`, {
params: new HttpParams().set('logNamespace', logNamespace)
})
}
Run Code Online (Sandbox Code Playgroud)
多个参数
到目前为止,我找到的最好的方法是定义一个Params
对象,其中包含我想要定义的所有参数.正如@estus在下面的评论中指出的那样,本课题中有很多关于如何分配多个参数的好答案.
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 })
Run Code Online (Sandbox Code Playgroud)
带条件逻辑的多参数
我经常使用多个参数做的另一件事是允许使用多个参数而不需要它们存在于每个调用中.使用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 })
Run Code Online (Sandbox Code Playgroud)
Jay*_*ase 80
您可以(在版本5+中)在创建HttpParamaters时使用fromObject和fromString构造函数参数以使事情更容易一些
const params = new HttpParams({
fromObject: {
param1: 'value1',
param2: 'value2',
}
});
// http://localhost:3000/test?param1=value1¶m2=value2
Run Code Online (Sandbox Code Playgroud)
要么:
const params = new HttpParams({
fromString: `param1=${var1}¶m2=${var2}`
});
//http://localhost:3000/test?paramvalue1=1¶m2=value2
Run Code Online (Sandbox Code Playgroud)
小智 11
你可以像这样传递它
let param: any = {'userId': 2};
this.http.get(`${ApiUrl}`, {params: param})
Run Code Online (Sandbox Code Playgroud)
Dar*_*yne 10
更简洁的解决方案:
this._Http.get(`${API_URL}/api/v1/data/logs`, {
params: {
logNamespace: logNamespace
}
})
Run Code Online (Sandbox Code Playgroud)
使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
151396 次 |
最近记录: |