如何在 Java 中将变量传递给 GraphQL 请求

问题描述 投票:0回答:1

我使用以下 Java 代码片段调用 GraphQL 端点。

    public void scheduleOrdAggregation(){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        String query = "mutation {\n" +
                "    result: scheduleOpenResourceDiscoveryAggregation(\n" +
                "        applicationID: $applicationId\n" +
                "    )\n" +
                "    {\n" +
                "        operationId\n" +
                "    }\n" +
                "}";
        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("query", query);
        Map<String, Object> variables = new HashMap<>();
        variables.put("applicationId", "e3be7c76-9852-4f10-afc3-ca6da082e813");
        requestBody.put("variables", variables);
        //requestBody.put("variable_values", Collections.singletonMap("applicationId", "e3be7c76-9852-4f10-afc3-ca6da082e813"));

        HttpEntity<Object> entity = new HttpEntity<>(requestBody, headers);
        ResponseEntity<String> response = restTemplateForUcl.postForEntity(uclEndpoint, entity, String.class);
    }

但是我收到一条错误消息

422 Unprocessable Entity: "{"errors":[{"message":"Internal Server Error [errorID=920abef1-2ad2-4238-90b7-9552f49d428f, reason: input:3: Variable \"$applicationId\" is not defined.]","extensions":{"error":"InternalError","error_code":10}}],"data":null}"

我的语法有错误吗?如果我对字段 applicationID 而不是变量进行硬编码,它就可以正常工作。

我还没有使用 Spring Graph QL,但想知道这是否是正确的选择?

感谢您的投入。 普拉巴尔

java graphql
1个回答
0
投票

我不知道这是否是唯一的问题,因为我从来没有在没有库支持的情况下编写过 GraphQL 请求,但是当分解你的突变时,它目前看起来像这样:

mutation {
    result: scheduleOpenResourceDiscoveryAggregation(
        applicationID: $applicationId
    ) {
        operationId
    }
}

在突变中,您使用的是变量

$applicationId
。看起来这里缺少变量声明。它应该看起来更像这样:

mutation($applicationId: ID!) {
    result: scheduleOpenResourceDiscoveryAggregation(
        applicationID: $applicationId
    ) {
        operationId
    }
}

但是,如果您在服务中经常使用 GraphQL,与每次手动编写代码相比,利用此框架可以节省大量时间并减少出错的机会。 spring-for-graphql 附带了很多有用的类,例如 GraphQL 客户端,这可以使编写请求变得更加容易。例如,你可以这样做:

class TasklistAdapter(
    private val client: HttpGraphQlClient
) : TasklistApi {

    ...

    override fun sendCompleteUserTaskCommand(userTaskId: String, data: Map<String, Any>): Boolean {
        val result = client.document(completeUserTask)
            .variable("id", userTaskId)
            .variable("data", data)
            .execute()
            .block()

        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.