我从我的角应用程序调用REST,我用类型记录编写了服务类下面的代码。我想调用不同的url,并根据环境选择传递不同的头。例如:如果环境是dev,那么userURL
值应该是http://mydomain-dev.com/users/
,标头应该是devHttpOptions
,对于E 117
QAE 218
-d19应该是http://mydomain-qa.com/users/和E 121头E 222应该是qaHttpOptions等等。
我编写了下面的开关案例语句,基于环境值,我正在决定应该分配哪个url和header。
但是,当我在this.httpOptions中传递get method - this.http.get<User[]>(this.userURL, this.httpOptions)时,编译时出错。
Type 'Observable<HttpEvent<User[]>>' is not assignable to type 'Observable<User[]>'.
Type 'HttpEvent<User[]>' is not assignable to type 'User[]'.
Type 'HttpSentEvent' is missing the following properties from type 'User[]': length, pop, push, concat, and 28 more.ts(
请在下面找到我的代码:
UserService.ts
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
import { User } from "./user";
import { HttpHeaders } from '@angular/common/http';
@Injectable({ providedIn: 'root' })
export class UserService {
constructor(private http: HttpClient) { }
userURL: any;
httpOptions: any;
devHttpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('dev-xxxx:yyyy')
})
};
qaHttpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('qa-xxxx:yyyy')
})
};
prodHttpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('prod-xxxx:yyyy')
})
};
getUsers(environment): Observable<User[]> {
console.log(environment);
switch (environment) {
case 'dev':
this.userURL = 'http://mydomain-dev.com/users/';
this.httpOptions = this.devHttpOptions;
break;
case 'qa':
this.userURL = 'http://mydomain-qa.com/users/';
this.httpOptions = this.qaHttpOptions;
break;
case 'prod':
this.userURL = 'http://mydomain-prod.com/users/';
this.httpOptions = this.prodHttpOptions;
break;
}
return this.http.get<User[]>(this.userURL, this.httpOptions);
}
}
你能帮我解决这个问题吗。感谢您的提前帮助!谢谢!
发布于 2022-04-21 23:41:23
在类型为any的httpsOptions变量上找不到headers,因此您可以直接以这种方式使用它。你应该这样做:
return this.http.get<User[]>(this.userURL, {
headers: this.httpOptions?.headers
});
发布于 2022-04-21 23:50:26
您可以在这里看到get()
的所有重载:
https://angular.io/api/common/http/HttpClient#get
它不知道httpOptions
是一个对象,所以它使用了错误的重载。当您使用any
时,它默认为与get<T>
匹配的第一个重载,该重载返回Observable<HttpEvent<T>>
。如果声明一个没有observe
属性的对象,它将使用所需的重载,因为observe
是该对象的可选属性,而其他属性是必需的。
将httpOptions
初始化为对象或将其声明为对象。
httpOptions = {};
或
httpOptions: Object;
或者,您可以将observe: 'body'
放在options对象上。它将显式地选择所需的重载。
httpOptions: any;
getUsers(environment) {
...
return this.http.get<User[]>(this.userURL, {
...this.httpOptions,
observe: 'body',
});
}
https://stackoverflow.com/questions/71961655
复制相似问题