我正在尝试使用apollo RESTDataSource包装我的其余api。我需要将一些标头传递给api调用。
我正在遵循文档中的示例:https://www.apollographql.com/docs/apollo-server/features/data-sources#intercepting-fetches
这是我的代码:
willSendRequest(request: RequestOptions) {
console.log(`request 1: ${JSON.stringify(request)}`);
request.headers.set('Authorization', this.context.authorization);
console.log(`request 2: ${JSON.stringify(request)}`);
}
我希望标题包含“授权”。但是它总是空的。
上述代码中的日志:
request 1: {"method":"POST","path":"partnerinvoices","body":{"command": "input","params":{},"headers":{}}
request 2: {"method":"POST","path":"partnerinvoices","body":{"command":"input","params":{},"headers":{}}
我可以使用willSendRequest
方法覆盖正文和参数,而不会出现任何问题。
答案 0 :(得分:1)
您可以通过几种方法来实现此目标,
在扩展RESTDataSource的Datasources
类中,在发出请求之前设置标头
willSendRequest(request) {
request.headers.set('Authorization', 'Bearer .....')
}
或作为数据源方法中的第三个参数(发布,获取,放置...)
this.post('endpoint', {}, { headers: { 'Authorization': 'Bearer ...' } })
答案 1 :(得分:0)
如果要使用Typescript,则必须与willSendRequest
方法的原始签名相匹配:
protected willSendRequest?(request: RequestOptions): ValueOrPromise<void>;
(链接到docs)
因此,请确保该方法如下所示:
protected willSendRequest?(request: RequestOptions): ValueOrPromise<void> {
request.headers.set("Authorization", this.context.authorization);
}
答案 2 :(得分:0)
您需要使用request.headers.get('Authorization')
来获取所需的数据。使用JSON.stringify
不会为您提供标头值,因为它不是对象文字。
willSendRequest(request: RequestOptions) {
console.log(`request 1: ${request.headers.get('Authorization')}`);
request.headers.set('Authorization', this.context.authorization);
console.log(`request 2: ${request.headers.get('Authorization')}`);
}