Angular : 使用与 HttpClient 等效的 Http RequestOptions
Angular : Using the equivalent of RequestOptions of Http with HttpClient
我正在从 Http 迁移到 HttpClient
我习惯于向我的 http 请求添加一些 headers,如下所示:
import { RequestOptions, Request, RequestMethod, Headers } from '@angular/http';
this.pass = btoa(cuid + ': ');
this.pass = "Basic " + this.pass;
this.header = new Headers();
this.header.set("Authorization", this.pass);
let options = new RequestOptions({
headers: this.header
});
return this.http.post(myServiceUrl, {}, options)
现在迁移到 httpClient 时,我已经试过了:
import {HttpClient, HttpHeaders} from '@angular/common/http';
const header = new HttpHeaders();
const pass = 'Basic ' + btoa(cuid + ': ');
header.set('Authorization', pass);
const options = ({
headers: header
});
return this.httpClient.post(myServiceUrl, {}, options);
但如您所见,ivent 找到了 RequestOptions 的等价物,而整个处理未能添加相同的 headers.
建议??
等效的 http 客户端应为:
const headers = new HttpParams().set('Authorization', pass);
return this.httpClient.post(myServiceUrl, {}, {headers: headers});
HttpClient.post
方法具有以下签名:
post(url: string, body: any | null, options: OptionsType)
其中OptionsType
如下(相当于RequestOptions
)
{
headers?: HttpHeaders | { [header: string]: string | string[] };
observe?: "body";
params?: HttpParams | { [param: string]: string | string[] };
reportProgress?: boolean;
responseType: "arraybuffer";
withCredentials?: boolean;
};
从那里你可以给你分配 header 或参数,比如:
const options = {
headers: new HttpHeaders().append('key', 'value'),
params: new HttpParams().append('key', 'value')
}
this.httpClient.post(url, {}, options)
你也可以看看this question
我之前通过在 getHeaders(token)
:
服务中创建一个方法来完成此操作
getHeaders(token) {
return new HttpHeaders().set('Authorization', `Bearer ${token}`);
}
然后在发出请求时只需将其附加到请求中,如下所示:
this.http.post(url, body, this.getHeaders(token));
还有 HttpInterceptor 可以针对请求自动执行此操作,这里有一篇文章:https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/
我已经使用 Firebase Auth 为我的令牌完成了这样的操作。
这是 token.interceptor.ts 文件:
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
afAuth: any;
constructor(
private inj: Injector
) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.afAuth = this.inj.get(AngularFireAuth);
return this.getToken().pipe(
switchMap(token => {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request);
})
);
}
getToken() {
return Observable.fromPromise(this.afAuth.auth.currentUser.getIdToken());
}
}
然后您需要将此提供给您的顶级 app.module,如下所示:
{ provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }
这里的作用是为自动处理的每个 HTTP 请求设置授权令牌,这样您就不必在发出请求之前等待令牌。请记住,这是非常特定于 Firebase Auth 的,因为这就是给我 JWT 令牌的原因。希望对您有所帮助!
根据 https://angular.io/guide/deprecations RequestOptions
替换为 HttpRequest
我正在从 Http 迁移到 HttpClient 我习惯于向我的 http 请求添加一些 headers,如下所示:
import { RequestOptions, Request, RequestMethod, Headers } from '@angular/http';
this.pass = btoa(cuid + ': ');
this.pass = "Basic " + this.pass;
this.header = new Headers();
this.header.set("Authorization", this.pass);
let options = new RequestOptions({
headers: this.header
});
return this.http.post(myServiceUrl, {}, options)
现在迁移到 httpClient 时,我已经试过了:
import {HttpClient, HttpHeaders} from '@angular/common/http';
const header = new HttpHeaders();
const pass = 'Basic ' + btoa(cuid + ': ');
header.set('Authorization', pass);
const options = ({
headers: header
});
return this.httpClient.post(myServiceUrl, {}, options);
但如您所见,ivent 找到了 RequestOptions 的等价物,而整个处理未能添加相同的 headers.
建议??
等效的 http 客户端应为:
const headers = new HttpParams().set('Authorization', pass);
return this.httpClient.post(myServiceUrl, {}, {headers: headers});
HttpClient.post
方法具有以下签名:
post(url: string, body: any | null, options: OptionsType)
其中OptionsType
如下(相当于RequestOptions
)
{
headers?: HttpHeaders | { [header: string]: string | string[] };
observe?: "body";
params?: HttpParams | { [param: string]: string | string[] };
reportProgress?: boolean;
responseType: "arraybuffer";
withCredentials?: boolean;
};
从那里你可以给你分配 header 或参数,比如:
const options = {
headers: new HttpHeaders().append('key', 'value'),
params: new HttpParams().append('key', 'value')
}
this.httpClient.post(url, {}, options)
你也可以看看this question
我之前通过在 getHeaders(token)
:
getHeaders(token) {
return new HttpHeaders().set('Authorization', `Bearer ${token}`);
}
然后在发出请求时只需将其附加到请求中,如下所示:
this.http.post(url, body, this.getHeaders(token));
还有 HttpInterceptor 可以针对请求自动执行此操作,这里有一篇文章:https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/
我已经使用 Firebase Auth 为我的令牌完成了这样的操作。 这是 token.interceptor.ts 文件:
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
afAuth: any;
constructor(
private inj: Injector
) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.afAuth = this.inj.get(AngularFireAuth);
return this.getToken().pipe(
switchMap(token => {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request);
})
);
}
getToken() {
return Observable.fromPromise(this.afAuth.auth.currentUser.getIdToken());
}
}
然后您需要将此提供给您的顶级 app.module,如下所示:
{ provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }
这里的作用是为自动处理的每个 HTTP 请求设置授权令牌,这样您就不必在发出请求之前等待令牌。请记住,这是非常特定于 Firebase Auth 的,因为这就是给我 JWT 令牌的原因。希望对您有所帮助!
根据 https://angular.io/guide/deprecations RequestOptions
替换为 HttpRequest