GraphQL
은 헤더를 활용할 수 있다
만약 GraphQL
에 헤더를 넣고 활용하고 싶다면 Inteceptor
를 활용하면 된다
@Component
public class RequestHeaderInterceptor implements WebGraphQlInterceptor {
@Override
public Mono<WebGraphQlResponse> intercept(WebGraphQlRequest request, Chain chain) {
String value = request.getHeaders().getFirst("AUTH");
request.configureExecutionInput((executionInput, builder) ->
builder.graphQLContext(Collections.singletonMap("AUTH", value)).build());
return chain.next(request);
}
}
@Controller
@RequiredArgsConstructor
public class RestController {
@QueryMapping
public Member getMember(@Argument Long id, GraphQLContext context){
System.out.println("header :: " + context.get("AUTH"));
return memberRepository.findById(id).get();
}
}
2023-02-14 21:56:46.461 INFO 11760 --- [nio-8080-exec-5] g.graphql.controller.RestController : header :: TOKE
WebGraphQlInterceptor
를 사용해서 WebGraphQlRequest
에 있는 header를 GraphQLContext
에 넣어서 이를 컨트롤러에서 사용하는 방식이다.
@Component
public class ResponseHeaderInterceptor implements WebGraphQlInterceptor {
@Override
public Mono<WebGraphQlResponse> intercept(WebGraphQlRequest request, Chain chain) {
return chain.next(request).doOnNext(response -> {
String value = response.getExecutionInput().getGraphQLContext().get("token");
ResponseCookie cookie = ResponseCookie.from("token", value).build();
response.getResponseHeaders().add(HttpHeaders.SET_COOKIE, cookie.toString());
});
}
}
@Slf4j
@Controller
@RequiredArgsConstructor
public class RestController {
@QueryMapping
public Member getMember(@Argument Long id, GraphQLContext context){
context.put("token", "test");
return memberRepository.findById(id).get();
}
}
마찬가지로 header에 값을 담아서 응답하고 싶다면 WebGraphQlInterceptor
를 활용해서 값을 담을 수 있다