使用 Java 以编程方式对 GraphQL API 进行 POST 调用
Make a POST call to GraphQL API programmatically using Java
我必须发送一个带有一些 headers 和 graphQL 变量的查询作为对 java 中的 GraphQL API 的 POST 调用。我还必须在查询中发送一些 headers 和身份验证参数。现在,我正在 POSTMAN 中进行手动调用,但我想以编程方式执行此操作。你们能帮我从哪里开始吗?我的查询和变量如下
query sampleQuery($param: SampleQueryParams!, $pagingParam: PagingParams) {
sampleLookup(params: $param, pagingParams: $pagingParam) {
ID
name1
name2
}
}
我的 GraphQL 变量如下:
{"param": {"id": 58763897}, "pagingParam": {"pageNumber": 0, "pageSize": 10 } }
我不知道从哪里开始。你们能帮忙吗
下面是 java 后端
的典型 graphql 端点
这里有2个基本流程
1 一个 http 请求的端点,可以将 graghql 查询处理为字符串和映射/json 表示查询的输入变量
2 用于整理和 return 数据的后端的 graphql 接线
后端通常会有一个如下所示的端点 (1)
public Map<String, Object> graphqlGET(@RequestParam("query") String query,
@RequestParam(value = "operationName", required = false) String operationName,
@RequestParam("variables") String variablesJson) throws IOException {...
注意我们有 3 个输入
查询字符串,
查询变量
的字符串通常 json
一个可选的 "operationName"
一旦我们解析了这些输入参数,我们通常会将它们发送到查询的 graphql 实现
可能看起来像这样 (1)
private Map<String, Object> executeGraphqlQuery(String operationName,
String query, Map<String, Object> variables) {
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(query)
.variables(variables)
.operationName(operationName)
.build();
return graphql.execute(executionInput).toSpecification();
}
此处 graphql 对象具有所有连接到 return 数据
所以一个解决方案就是post将正确格式的输入参数传给后端
我经常使用 android 和一个与旧 android 版本一起工作的 http 客户端,因此 kotlin 中的 post 请求看起来像这样作为一个非常简单的示例
val client = HttpClients.createDefault()
val httpPost = HttpPost(url)
val postParameters = ArrayList<NameValuePair>()
postParameters.add(BasicNameValuePair("query", "query as string"))
postParameters.add(BasicNameValuePair("variables", "variables json string"))
httpPost.entity = UrlEncodedFormEntity(postParameters, Charset.defaultCharset())
val response = client.execute(httpPost)
val ret = EntityUtils.toString(response.getEntity())
请注意 http post 的实现取决于后端 java 实现的设置方式
对于基本的 http 客户端和 post 在此处设置许多很好的示例
可能相关
graphql 允许内省流程,它发布有关实现支持的查询结构的详细信息
更多信息在这里
出于这些目的,我建议使用 graphql-java-codegen
插件。
它提供了根据您可以提供给任何 HTTP 客户端的架构生成 类 的可能性。
例如,GraphQL 服务器具有以下架构,我们要执行 productById
查询:
type Query {
productById(id: ID!): Product
}
type Product {
id: ID!
title: String!
price: BigDecimal!
}
graphql-java-codegen
将生成您执行查询所需的所有 类:
// preparing request
ProductByIdQueryRequest request = new ProductByIdQueryRequest();
request.setId(productId);
// preparing response projection (which fields to expect in the response)
ProductResponseProjection responseProjection = new ProductResponseProjection()
.id()
.title()
.price();
// preparing a composite graphql request
GraphQLRequest graphQLRequest = new GraphQLRequest(request, responseProjection);
// performing a request with the constructed object
ProductByIdQueryResponse responseBody = restTemplate.exchange(URI.create("https://product-service:8080/graphql"),
HttpMethod.POST,
new HttpEntity<>(graphQLRequest.toHttpJsonBody()),
ProductByIdQueryResponse.class).getBody();
// Fetching a serialized object from response
Product product = responseBody.productById();
可以在 GitHub 上找到更多示例:https://github.com/kobylynskyi/graphql-java-codegen#supported-plugins
我必须发送一个带有一些 headers 和 graphQL 变量的查询作为对 java 中的 GraphQL API 的 POST 调用。我还必须在查询中发送一些 headers 和身份验证参数。现在,我正在 POSTMAN 中进行手动调用,但我想以编程方式执行此操作。你们能帮我从哪里开始吗?我的查询和变量如下
query sampleQuery($param: SampleQueryParams!, $pagingParam: PagingParams) {
sampleLookup(params: $param, pagingParams: $pagingParam) {
ID
name1
name2
}
}
我的 GraphQL 变量如下:
{"param": {"id": 58763897}, "pagingParam": {"pageNumber": 0, "pageSize": 10 } }
我不知道从哪里开始。你们能帮忙吗
下面是 java 后端
的典型 graphql 端点这里有2个基本流程
1 一个 http 请求的端点,可以将 graghql 查询处理为字符串和映射/json 表示查询的输入变量
2 用于整理和 return 数据的后端的 graphql 接线
后端通常会有一个如下所示的端点 (1)
public Map<String, Object> graphqlGET(@RequestParam("query") String query,
@RequestParam(value = "operationName", required = false) String operationName,
@RequestParam("variables") String variablesJson) throws IOException {...
注意我们有 3 个输入
查询字符串,
查询变量
的字符串通常 json
一个可选的 "operationName"
一旦我们解析了这些输入参数,我们通常会将它们发送到查询的 graphql 实现
可能看起来像这样 (1)
private Map<String, Object> executeGraphqlQuery(String operationName,
String query, Map<String, Object> variables) {
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(query)
.variables(variables)
.operationName(operationName)
.build();
return graphql.execute(executionInput).toSpecification();
}
此处 graphql 对象具有所有连接到 return 数据
所以一个解决方案就是post将正确格式的输入参数传给后端
我经常使用 android 和一个与旧 android 版本一起工作的 http 客户端,因此 kotlin 中的 post 请求看起来像这样作为一个非常简单的示例
val client = HttpClients.createDefault()
val httpPost = HttpPost(url)
val postParameters = ArrayList<NameValuePair>()
postParameters.add(BasicNameValuePair("query", "query as string"))
postParameters.add(BasicNameValuePair("variables", "variables json string"))
httpPost.entity = UrlEncodedFormEntity(postParameters, Charset.defaultCharset())
val response = client.execute(httpPost)
val ret = EntityUtils.toString(response.getEntity())
请注意 http post 的实现取决于后端 java 实现的设置方式
对于基本的 http 客户端和 post 在此处设置许多很好的示例
可能相关
graphql 允许内省流程,它发布有关实现支持的查询结构的详细信息 更多信息在这里
出于这些目的,我建议使用 graphql-java-codegen
插件。
它提供了根据您可以提供给任何 HTTP 客户端的架构生成 类 的可能性。
例如,GraphQL 服务器具有以下架构,我们要执行 productById
查询:
type Query {
productById(id: ID!): Product
}
type Product {
id: ID!
title: String!
price: BigDecimal!
}
graphql-java-codegen
将生成您执行查询所需的所有 类:
// preparing request
ProductByIdQueryRequest request = new ProductByIdQueryRequest();
request.setId(productId);
// preparing response projection (which fields to expect in the response)
ProductResponseProjection responseProjection = new ProductResponseProjection()
.id()
.title()
.price();
// preparing a composite graphql request
GraphQLRequest graphQLRequest = new GraphQLRequest(request, responseProjection);
// performing a request with the constructed object
ProductByIdQueryResponse responseBody = restTemplate.exchange(URI.create("https://product-service:8080/graphql"),
HttpMethod.POST,
new HttpEntity<>(graphQLRequest.toHttpJsonBody()),
ProductByIdQueryResponse.class).getBody();
// Fetching a serialized object from response
Product product = responseBody.productById();
可以在 GitHub 上找到更多示例:https://github.com/kobylynskyi/graphql-java-codegen#supported-plugins