You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Google Web Risk Submission API未返回长时运行的operationID?

问题原因与解决方案

核心原因

Google Web Risk的提交接口属于长时运行操作(LRO),Java客户端库提供了两种调用模式,但官方文档示例未明确区分:

  • createSubmissionCallable():客户端会自动等待操作完成,直接返回最终的Submission结果,不会暴露operationID
  • createSubmissionOperationCallable():返回包含操作元数据的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);
  }
}

跟踪提交请求的方法

  1. 保存operationID:从Operation.getName()获取完整的操作名称(即operationID),妥善存储
  2. 轮询操作状态:使用getSubmissionOperationCallable()方法,传入operationID对应的GetOperationRequest,定期查询操作是否完成
  3. 处理结果:当操作状态变为DONE时,从Operation.getResponse()获取最终提交结果;若操作失败,通过Operation.getError()获取错误信息

内容的提问来源于stack exchange,提问作者Tal Amishai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:14