为何Google Web Risk Submission API未返回长时运行的operationID?
问题原因与解决方案
核心原因
Google Web Risk的提交接口属于长时运行操作(LRO),Java客户端库提供了两种调用模式,但官方文档示例未明确区分:
createSubmissionCallable():客户端会自动等待操作完成,直接返回最终的Submission结果,不会暴露operationIDcreateSubmissionOperationCallable():返回包含操作元数据的Operation对象,其中包含你需要的operationID
你之前的代码用了第一种模式,且Submission类本身不包含operationID字段,这就是找不到相关内容的原因。
修改后的代码示例
改用返回Operation对象的调用方式,即可获取operationID并跟踪操作状态:
import com.google.longrunning.Operation; import com.google.longrunning.GetOperationRequest; import java.util.concurrent.TimeUnit; try (WebRiskServiceClient webRiskServiceClient = WebRiskServiceClient.create()) { Submission submission = Submission.newBuilder() .setUri(uri) .build(); CreateSubmissionRequest submissionRequest = CreateSubmissionRequest.newBuilder() .setParent(String.format("projects/%s", projectId)) .setSubmission(submission) .build(); // 调用返回Operation的Callable,获取包含operationID的操作对象 Operation<Submission, SubmissionMetadata> operation = webRiskServiceClient.createSubmissionOperationCallable() .futureCall(submissionRequest) .get(3, TimeUnit.MINUTES); // 提取operationID(格式为 projects/{project-id}/operations/{operation-id}) String operationId = operation.getName(); System.out.println("Operation ID: " + operationId); // 检查操作是否完成,若未完成可后续查询 if (!operation.isDone()) { // 构造查询请求,传入operationID GetOperationRequest getOpRequest = GetOperationRequest.newBuilder() .setName(operationId) .build(); // 调用接口查询操作状态 Operation<Submission, SubmissionMetadata> updatedOperation = webRiskServiceClient.getSubmissionOperationCallable() .futureCall(getOpRequest) .get(); if (updatedOperation.isDone()) { Submission finalSubmission = updatedOperation.getResponse(); System.out.println("Final submission result: " + finalSubmission); } } else { // 操作已完成,直接获取结果 Submission submissionResponse = operation.getResponse(); System.out.println("Submission response: " + submissionResponse); } }
跟踪提交请求的方法
- 保存operationID:从
Operation.getName()获取完整的操作名称(即operationID),妥善存储 - 轮询操作状态:使用
getSubmissionOperationCallable()方法,传入operationID对应的GetOperationRequest,定期查询操作是否完成 - 处理结果:当操作状态变为
DONE时,从Operation.getResponse()获取最终提交结果;若操作失败,通过Operation.getError()获取错误信息
内容的提问来源于stack exchange,提问作者Tal Amishai
相关产品推荐
相关产品推荐

