开发者社区 问答 正文

在文档智能中调用接口,返回id,id输入query怎么通不了,要用轮询?

在文档智能中调用接口,返回id,id输入query怎么通不了,要用轮询?

展开
收起
花开富贵111 2024-04-16 18:12:39 40 分享 版权
阿里云 AI 助理回答

在文档智能中调用接口时,返回的 id 是用于查询任务处理结果的关键标识。根据知识库中的说明,文档智能的接口通常采用异步任务处理机制,这意味着提交任务后不会立即返回最终结果,而是需要通过轮询的方式获取任务的处理状态和结果。

以下是详细的原因和操作步骤:


1. 为什么需要轮询?

文档智能的接口设计为异步处理模式,主要原因是文档解析、抽取或转换等任务可能涉及复杂的计算和处理流程,耗时较长。因此,提交任务后,系统会立即返回一个任务标识符(即 id),而实际的任务处理会在后台进行。

  • 处理中:任务尚未完成,此时 Completed 字段为 false
  • 处理成功:任务完成且成功,此时 Completed 字段为 trueStatus 字段为 Success
  • 处理失败:任务完成但失败,此时 Completed 字段为 trueStatus 字段为 Fail,并附带错误码和详细信息。

直接使用 id 查询时,如果任务尚未完成,则无法获取最终结果,因此需要通过轮询机制不断查询任务状态,直到任务完成或超时。


2. 轮询的具体操作步骤

以下是调用文档智能接口并进行轮询的标准流程:

步骤一:提交任务

调用异步任务提交接口(如 SubmitDocumentExtractJob 或其他相关接口),提交文档处理请求。接口会返回一个任务标识符 id

示例返回:

{
 "RequestId": "43A29C77-405E-4CC0-BC55-EE694AD00655",
 "Data": {
 "Id": "docmind-20220712-b15fe420"
 }
}

步骤二:轮询任务状态

使用上一步返回的 id,调用结果查询接口(如 GetDocumentExtractResult 或其他相关接口)查询任务状态。建议每 10秒轮询一次,最多轮询 120分钟

请求参数
名称类型必填描述示例值
Idstring需要查询的业务订单号,从提交接口返回。docmind-20220712-b15f****
返回参数
名称类型描述示例值
RequestIdstring请求唯一ID。43A29C77-405E-4CC0-BC55-**
Completedboolean异步任务是否处理完成,false 表示仍在处理中,true 表示已完成。true
Statusstring任务完成状态,Success 表示成功,Fail 表示失败。Success
Datastring返回数据,具体结构取决于任务类型(如表格解析、文档抽取等)。-
Codestring状态码。200
Messagestring详细信息。Message
轮询逻辑
  • 如果 Completedfalse,表示任务仍在处理中,需继续轮询。
  • 如果 Completedtrue,检查 Status 字段:
    • Success:任务成功,提取 Data 中的结果。
    • Fail:任务失败,查看 CodeMessage 获取错误原因。

3. 注意事项

  • 轮询频率:建议每 10秒轮询一次,避免过于频繁的请求导致服务压力。
  • 轮询超时:最多轮询 120分钟,若超过此时间仍未完成,则视为任务超时。
  • 结果有效期:异步任务提交后,结果在 24小时内可查询,超过时间将无法获取。
  • 错误处理:如果任务失败,CodeMessage 字段会提供详细的错误信息,请根据提示排查问题。

4. 示例代码

以下是一个轮询的示例代码(以 Python 为例):

import time
from alibabacloud_docmind_api20220711.client import Client as DocmindClient
from alibabacloud_tea_openapi.models import Config
from alibabacloud_docmind_api20220711.models import GetDocumentExtractResultRequest

# 初始化客户端
config = Config(
    access_key_id="your-access-key-id",
    access_key_secret="your-access-key-secret",
    endpoint="docmind-api.cn-hangzhou.aliyuncs.com"
)
client = DocmindClient(config)

# 提交任务后返回的 id
task_id = "docmind-20220712-b15f****"

# 轮询任务状态
def poll_task_status(task_id):
    request = GetDocumentExtractResultRequest(id=task_id)
    max_poll_time = 120 * 60  # 最大轮询时间 120 分钟
    poll_interval = 10  # 轮询间隔 10 秒
    elapsed_time = 0

    while elapsed_time < max_poll_time:
        response = client.get_document_extract_result(request)
        completed = response.body.completed
        if completed:
            if response.body.status == "Success":
                print("任务成功,结果:", response.body.data)
                return
            elif response.body.status == "Fail":
                print("任务失败,错误信息:", response.body.message)
                return
        time.sleep(poll_interval)
        elapsed_time += poll_interval

    print("任务超时,未在规定时间内完成。")

poll_task_status(task_id)

5. 总结

由于文档智能接口采用异步处理机制,直接使用 id 查询可能无法立即获取结果,因此需要通过轮询方式不断检查任务状态。请按照上述步骤和注意事项操作,确保任务结果能够正确获取。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答