天天看點

GraphQL的graphql-java-servlet子產品詳解

本質上,graphql-java-servlet軟體子產品實作了一個Java Servlet,将GraphQL服務釋出為通過HTTP可通路的Web服務。目前,graphql-java-servlet軟體子產品隻支援GraphQL的Query和Mutation操作類型,還不支援subscription操作類型。

graphql-java-servlet軟體子產品的最新版本是2017.12釋出的4.7.0。

1. graphql-java-servlet依賴如下子產品

  • javax.servlet:javax.servlet-api:3.0.1
  • com.graphql-java:graphql-java:6.0
  • com.fasterxml.jackson.core:jackson-*:2.8.4

2. 在Maven項目中使用graphql-java-servlet,隻要在pom.xml中如下引用

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-servlet</artifactId>
    <version>4.7.0</version>
</dependency>
           

3. graphql-java-servlet軟體子產品隻是一個Servlet,即隻提供了唯一的Web請求路徑

雖然隻是一個Servlet,但是同時支援HTTP GET/POST請求,而且根據請求參數的不同,可以有多種請求的方式。

1)内部結構查詢GET請求

http://localhost:8080/graphql/schema.json

2)GraphQL查詢GET請求

http://localhost:8080/graphql/?query={...}

3)GraphQL查詢 POST請求

http://localhost:8080/graphql/

{"query":"{hello}"}

4)GraphQL查詢(multipart/form-data)POST請求

http://localhost:8080/graphql/

{"graphql": {"query":"{hello}"}}

5)GraphQL查詢(multipart/form-data)POST請求

http://localhost:8080/graphql/

{"query": {"{hello}"}}

說明:對于每個請求(可能是query或mutation),可以帶參數的"operationName","variables",其中"operationName"是操作的對象,"variables"是操作對象的屬性集。

預設請求的HTTP Content-Type為application/json;charset=UTF-8。

4. 在Spring Web應用中使用graphql-java-servlet子產品

1)通過graphql-spring-boot子產品,間接使用graphql-java-servlet子產品,詳情請參考graphql-spring-boot,結合GraphQL的Spring Boot Starters類庫概述。

2)通過定義Spring bean如下

@Bean
ServletRegistrationBean graphQLServletRegistrationBean(GraphQLSchema schema, ExecutionStrategy executionStrategy, List<GraphQLOperationListener> operationListeners) {
    return new ServletRegistrationBean(new SimpleGraphQLServlet(schema, executionStrategy, operationListeners), "/graphql");
}
           

預設Web請求路徑為/graphql。

參考連結:

https://github.com/graphql-java/graphql-java-servlet