我一直在寻找一种将查询参数传递到使用 new 的 API 调用HttpClientModule的方法HttpClient,但尚未找到解决方案。使用旧Http模块,您将编写类似这样的内容。
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 }) }
这将导致对以下 URL 的 API 调用:
localhost:3001/api/v1/data/logs?logNamespace=somelogsnamespace
但是,新HttpClient get()方法没有search属性,所以我想知道在哪里传递查询参数?
get()
search
我最终通过get()函数上的 IntelliSense 找到了它。所以,我会把它贴在这里给任何正在寻找类似信息的人。
无论如何,语法几乎相同,但略有不同。而不是使用URLSearchParams()需要初始化的参数,并且现在调用函数HttpParams()内的属性而不是.get()``params``search
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对于如何分配多个参数有很多很好的答案。
Params
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 })