我使用以下 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,但想知道这是否是正确的选择?
感谢您的投入。 普拉巴尔
我不知道这是否是唯一的问题,因为我从来没有在没有库支持的情况下编写过 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()
...
}
}