簡體   English   中英

如何從 spring 啟動應用程序中的 graphQL 端點中的傳入消息中讀取請求標頭

[英]How to read request headers from incoming message in a graphQL endpoint in spring boot application

我有一個 spring 啟動應用程序運行一個 graphql 端點來驗證和執行查詢和突變,但是,我需要讀取一個 header 以將其值傳遞給傳入消息中的另一個端點。 graphql 中有沒有辦法讀取這些值? 某種 getHeaders 或類似的東西?

GraphQL 本身並沒有定義任何與如何通過網絡公開它相關的東西,因此它沒有定義任何與獲取 HTTP 標頭相關的東西。開發人員使用他們的方式。所以,這取決於你使用的底層技術通過 HTTP 提供 GraphQL。

考慮您使用graphql-spring-bootgraphql-java-tools ,並假設您沒有自定義GraphQLContext ,您可以嘗試將DataFetchingEnvironment參數添加到您的解析器函數,然后從中獲取GraphQLContext 然后,您可以從上下文中獲取HttpServletRequest並訪問標頭:

    public Foo resolveFoo(Map<String,String> input , DataFetchingEnvironment env){

        GraphQLContext context =  env.getContext();
        HttpServletRequest request = context.getHttpServletRequest().get();
        request.getHeader("content-type");
    }

@Ken Chan 的解決方案對我不起作用。 GraphQLContext沒有名為getHttpServletRequest方法。
改用GraphQLServletContext解決了這個問題。 您可以將代碼更改為:

public Foo resolveFoo(Map<String,String> input , DataFetchingEnvironment env){

    GraphQLServletContext context =  env.getContext();
    String header = context.getHttpServletRequest().getHeader("content-type");
}

顯然,上下文的類型沒有標准化。 我使用 SPQR,就我而言,我發現(通過調試):

        DefaultGlobalContext<ServletWebRequest> context = handlerParameters.getDataFetchingEnvironment().getContext();
        context.getNativeRequest().getHeader("something");

谷歌給我帶來了這個答案,不幸的是它是針對 Spring 框架的。 許多人使用 Spring 框架,但如果你像我一樣使用 Apache Tomcat 和 GraphQL 集成,你可以使用它。

        graphql.kickstart.servlet.context.DefaultGraphQLServletContext.DefaultGraphQLServletContext context =  dataFetchingEnvironment.getContext();
        jakarta.servlet.http.HttpServletRequest request = context.getHttpServletRequest();
        String tokenBearer = request.getHeader("Authorization");

不是對您的問題陳述的直接回答,但可以在請求到達解析器端點之前使用過濾器來處理它(如果這是必需的):

public class HeaderFilter implements Filter {

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
    final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    
    String headerVal= httpServletRequest.getHeader("<header string>");
    
    try {
        filterChain.doFilter(httpServletRequest, servletResponse);
    } catch (IOException | ServletException e) {
        //handle as you wish
    }
}

對於最新版本,這些答案太舊了。 您可以嘗試在controller中自動連接一個 HttpServletRequest ,例如

@Slf4j
@Controller
public class YourQueryController {
@Autowired
private HttpServletRequest request;
....

然后執行以下邏輯得到header:

request.getHeader("Authorization")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM