我一直在寻找一种方式来传递查询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属性,所以我想知道在哪里传递查询参数?
我刚刚注意到新Interceptor中不再支持可能在先前的HTTP RequestsOption中使用的Header对象.
这是新的拦截器逻辑:
// Get the auth header from the service.
const authHeader = this.auth.getAuthorizationHeader();
// Clone the request to add the new header.
const authReq = req.clone({headers: req.headers.set('Authorization', authHeader)});
Run Code Online (Sandbox Code Playgroud)
我现在有两种方法可以在此请求中添加标题:
例:
headers?: HttpHeaders;
headers: req.headers.set('token1', 'asd')
Run Code Online (Sandbox Code Playgroud)
setHeaders?: {
[name: string]: string | string[];
};
setHeaders: {
'token1': 'asd',
'token2': 'lol'
}
Run Code Online (Sandbox Code Playgroud)
如何在此请求中有条件地添加多个标头?与我以前使用Header对象相同:
myLovellyHeaders(headers: Headers) {
headers.set('token1', 'asd');
headers.set('token2', 'lol');
if (localStorage.getItem('token1')) {
headers.set('token3', 'gosh');
}
}
const headers = new Headers();
this.myLovellyHeaders(headers);
Run Code Online (Sandbox Code Playgroud) 我用这个:
import { HttpParams } from '@angular/common/http';
let params = new HttpParams();
params.append('newOrdNum','123');
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我不会在网址中附加param.有什么建议吗?
我正在尝试将Http请求迁移到HttpClient请求.我能够迁移我的post查询但我在迁移get查询时遇到问题.当我这样做时,我的后端没有分别收到任何参数,它告诉我没有提供参数并且为空.
我做错什么了吗?
import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
constructor(private httpClient: HttpClient) {}
findItems() {
let params: HttpParams = new HttpParams();
params.set('something', 'hello');
this.httpClient.get<any[]>('http://localhost:3000/apath/', {params})
.subscribe((results: any[]) => {
console.log(results);
}, (errorResponse: any) => {
console.error(errorResponse);
});
}
Run Code Online (Sandbox Code Playgroud)
任何的想法?
HttpClient的文档说明了关于不变性的以下内容:
存在拦截器来检查和改变传出请求和传入响应.但是,了解HttpRequest和HttpResponse类在很大程度上是不可变的可能会令人惊讶.
这是有原因的:因为app可能会重试请求,拦截器链可能会多次处理单个请求.如果请求是可变的,则重试的请求将与原始请求不同.不可变性确保拦截器在每次尝试时都看到相同的请求.
我发现很难理解这个解释.有人可以提供解释吗?
我有完全 angular 版本 4.3.2,由于依赖关系我无法更新。所以现在我坚持这个版本。我有一个带有动态参数的对象(里面可以有其他键和值):
let query = {
param1: 1,
param2: 'a'
}
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情:
params = new HttpParams();
params = params.append(query);
return this.httpClient.get(this.config.apiUrl + '/items', {
params: params,
headers: headers
});
Run Code Online (Sandbox Code Playgroud)
但没有这样的 params.append(query) 方法。所以我需要遍历查询键并将它们一一添加到参数中。有没有更简单的解决方案?
编辑1:
根据这个答案,这可以从 angular 5.0.0-beta.6 (2017-09-03) 开始完成,但对我来说不是解决方案。 /sf/answers/3242253031/
angular ×6
angular-http ×1
header ×1
http ×1
immutability ×1
interceptor ×1
lodash ×1
typescript ×1