我在Angular 4中编写了一个调用REST API(DJANGO)的应用程序。 代码如下:
export class ForecastUnitService {
private path = 'forecastunit/';
private options;
constructor (private http: Http, private c:CentralService) {
this.options=this.c.createOptions();
}
getForecastUnits(): Observable<ForecastUnit[]> {
return this.http.get(this.c.createURL(this.path),this.options)
.map(this.extractData)
.catch(this.handleError);
}
...
}
我添加了包含授权标头的选项,但我仍然可以 403被禁止。然而,当我尝试使用cUrl或Postman或swagger进行调用时,我会得到相同的结果。 首先,标题不正确,但是当我记录选项时,我得到:
{"method":null,"headers":{"Authorization":["**Correct Token**"],"Content-Type":["application/json"]},"body":null,"url":null,"withCredentials":null,"responseType":null}
所以这不是问题,当我查看Chrome的回复时,我会看到以下内容:
{"detail":"Authentication credentials were not provided."}
所以再没有凭据,但我真的通过了它们,出了什么问题?
答案 0 :(得分:1)
Angular的http
模块将所有标题名称更改为小写。这可能是一个问题,因为某些API服务不遵循规范,并且当它们不区分大小写时,它们的标头检查区分大小写。
检查API的配置。
我认为您的CentralService
会创建有效的选项。
interface RequestOptionsArgs {
url: string|null
method: string|RequestMethod|null
search: string|URLSearchParams|{[key: string]: any | any[]}|null
params: string|URLSearchParams|{[key: string]: any | any[]}|null
headers: Headers|null
body: any
withCredentials: boolean|null
responseType: ResponseContentType|null
}
接头:
class Headers {
static fromResponseHeaderString(headersString: string): Headers
constructor(headers?: Headers|{[name: string]: any}|null)
append(name: string, value: string): void
delete(name: string): void
forEach(fn: (values: string[], name: string|undefined, headers: Map<string, string[]>) => void): void
get(name: string): string|null
has(name: string): boolean
keys(): string[]
set(name: string, value: string|string[]): void
values(): string[][]
toJSON(): {[name: string]: any}
getAll(name: string): string[]|null
entries()
}
答案 1 :(得分:-1)
你能告诉我们CentralService吗? 您也可以避免在构造函数中调用它,而是实现OnInit