Apollo网关如何为子图添加动态自定义请求头?
为Apollo Gateway子图添加自定义请求头
完全可行,你可以利用buildService方法中获取到的子图name参数,为不同子图注入专属的自定义请求头。只需修改willSendRequest逻辑,根据子图名称判断并添加对应的请求头即可。
修改后的完整代码如下:
const { ApolloGateway, IntrospectAndCompose, RemoteGraphQLDataSource } = require("@apollo/gateway"); const gateway = new ApolloGateway({ supergraphSdl: new IntrospectAndCompose({ subgraphs: [ { name: "users-api", url: `users.private/graphql?` }, { name: "cars-api", url: `cars.private/graphql?` }, { name: "posts-api", url: `posts.private/graphql?` } ], }), buildService({ name, url }) { return new RemoteGraphQLDataSource({ url, willSendRequest({ request, context }) { // 保留原有传递上下文请求头的逻辑 Object.keys(context.headers || {}).forEach(key => { if (context.headers[key]) { request.http.headers.set(key, context.headers[key]); } }); // 根据子图名称添加自定义请求头 switch(name) { case "users-api": request.http.headers.set("service", "users"); break; case "cars-api": request.http.headers.set("service", "cars"); break; // 可按需为其他子图添加规则,或留空不处理 case "posts-api": break; } }, }); }, });
关键逻辑说明
buildService方法会为每个子图单独创建数据源实例,可直接获取当前子图的name标识- 在
willSendRequest钩子中,先执行原有逻辑传递上下文请求头,再根据子图名称匹配添加专属的service请求头 - 可按需扩展
switch语句,为更多子图配置不同的自定义请求头规则
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

