使用 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 允许内省流程,它发布有关实现支持的查询结构的详细信息 更多信息在这里

https://graphql.org/learn/introspection/

[1] https://github.com/graphql-java/graphql-java-examples

出于这些目的,我建议使用 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