![](/img/trans.png)
[英]How to get SOAP headers from MessageContext - In Spring Boot WS Application
[英]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-boot和graphql-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.