ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kotlin/Android 批量文档抽取的 URI 容错实践:用 Xberg extractBatch 处理不存在的输入

Kotlin/Android 批量文档抽取的 URI 容错实践:用 Xberg extractBatch 处理不存在的输入 后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本篇指南围绕 XbergRust 核心的多语言文档智能提取库在 Kotlin/Android 场景下的extractBatch批量抽取接口展开重点解决输入列表中某个 URI 指向不存在的文件时批量任务应如何表现、如何读取结果这一实战问题。读完本文你将掌握ExtractInput与ExtractionConfig的序列化写法、extractBatch的底层调用链Kotlin 绑定 → FFI → Rust 核心以及借助summary.results/summary.errors对批量结果做逐项判定与容错的方法。场景批量抽取时遇到文档不存在在真实业务中批量文档抽取如定时任务扫描一批本地路径、或从消息队列拿到一批待解析的文件地址经常会出现个别输入失效的情况文件被移动、删除、URL 过期或权限变更。如果整个批量调用因单个坏输入而整体失败会带来大量不必要的重试反之如果静默吞掉错误又会让数据质量无法被观测。仓库中的自动化契约用例extract_batch_uri_not_found正是对这一场景的明确规定。它的描述fixtures/batch/extract_batch_uri_not_found.json只有一句话extract_batch with missing URI input——即向批量抽取接口传入一个不存在的 URI。它同时给出了三条断言assertions: [ { type: not_error }, { type: equals, field: summary.results, value: 0 }, { type: equals, field: summary.errors, value: 1 } ]这三条断言精确刻画了 Xberg 的容错契约调用本身不抛异常not_error但结果统计中成功数为 0、错误数为 1。也就是说批量 API 把输入不存在建模为批内单条失败而不是批级失败。Kotlin/Android 的示例代码docs-site/src/snippets-generated/kotlin-android/batch/extract_batch_uri_not_found.md完整演示了这一行为。完整示例向 extractBatch 传入不存在的 URI原文档给出了可直接运行的最小 Kotlin 代码这里完整保留并逐步解读import io.xberg.* import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper fun main() kotlinx.coroutines.runBlocking { val mapper jacksonObjectMapper().setPropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategies.SNAKE_CASE) val configDefault mapper.readValue({\url\:{\crawl\:{\ssrf\:{}}}}, ExtractionConfig::class.java) val result Xberg.extractBatch(listOf(mapper.readValue({\kind\:\uri\,\uri\:\/nonexistent/a.pdf\}, ExtractInput::class.java)), configDefault) println(result.summary.results) println(result.summary.errors) }各环节的作用jacksonObjectMapper() SNAKE_CASEXberg 各语言绑定统一使用 snake_case 的 JSON 协议与 Rust 核心通信因此 mapper 必须设置为PropertyNamingStrategies.SNAKE_CASE否则mimeType、remoteUrls这类字段无法正确映射。configDefault一份几乎为空的默认配置仅声明了{url:{crawl:{ssrf:{}}}}。它表明当输入为 URI 并触发 URL 爬取时需要应用 SSRF服务端请求伪造防护策略空对象{}表示采用策略的默认值。在 C FFI 头文件crates/xberg-ffi/include/xberg.h中可以看到CrawlConfig暴露了ssrf字段对应的SsrfPolicy至少包含deny_private、allowlist、max_redirects、scheme_allowlist四个维度即默认策略会约束允许访问的协议、禁止访问私网地址、限制重定向次数。ExtractInput输入{kind:uri,uri:/nonexistent/a.pdf}声明一个 URI 类型的输入指向一个不存在的本地绝对路径。字段定义见 ExtractInput.ktkind取bytes或uri默认URIuri可以是本地路径、file://URI 或 HTTP(S) URL此外还支持bytes、mimeType、filename、config等可选字段。println(result.summary.results / errors)直接打印批量汇总的成功数与错误数。按契约断言此处应输出0和1。底层调用链Kotlin 绑定如何抵达 Rust 核心extractBatch不是 Kotlin 侧的本地实现而是通过 JNI 桥接到 Rust 核心。实现位于 packages/kotlin-android/src/main/kotlin/io/xberg/Xberg.kt/** Extract content from multiple bytes or URI inputs. */ fun extractBatch(inputs: ListExtractInput, config: ExtractionConfig): ExtractionResult { val resultJson XbergBridge.nativeExtractBatch( mapper.writerFor(mapper.typeFactory.constructCollectionType( List::class.java, ExtractInput::class.java)).writeValueAsString(inputs), mapper.writeValueAsString(config)) return mapper.readValue(resultJson, ExtractionResult::class.java) }从源码结构看整个调用路径是调用方构造ListExtractInput与ExtractionConfigXbergBridge.nativeExtractBatch把输入列表与配置序列化为 JSON经 JNI 传给 Rust 侧Rust 核心逐条解析输入、执行格式探测与抽取支持 106 种格式 / 140 种扩展名、371 种语言的代码智能见项目根目录 README.md任一输入失败不会中断整批处理而是被记入批级统计结果 JSON 返回后在 Kotlin 侧反序列化为ExtractionResult其summary字段类型定义于 ExtractionSummary.kt。批级统计字段读懂 summary 的每一个数字ExtractionResultpackages/kotlin-android/src/main/kotlin/io/xberg/ExtractionResult.kt中summary: ExtractionSummary是理解批量结果的唯一入口其统计字段如下字段类型含义inputsLong本批接收到的输入总数resultsLong成功完成抽取的输入数errorsLong失败输入数remoteUrlsLong涉及远程 URL 下载的输入数pagesCrawledLong爬取网页时累计访问的页面数documentsDownloadedLong实际下载成功的文档数在本例中输入列表只有 1 项inputs 1文件不存在导致results 0、errors 1。这三者之间的关系inputs results errors的边界情况是批量任务状态机的基础只要errors 0就说明至少有一条输入需要排查而results对应的成功文档仍可正常消费二者互不阻塞。实战要点在生产代码中正确处理批内失败结合上述契约在 Android/Kotlin 项目中落地批量抽取时建议遵循以下模式不要用 try/catch 吞掉整批调用。契约明确not_error——URI 不存在这类输入级错误不会抛异常抛异常的通常是配置校验、网络栈或序列化层面的批级错误二者要区分处理。每次调用后检查summary.errors。若errors 0应把本批的ExtractInput列表与summary关联起来做补偿记录日志、进入重试队列或标记人工处理。成功文档照常消费。results不为 0 时对应的抽取结果仍然有效不必因个别失败丢弃整批产物。对 URI 输入保持 SSRF 默认防护。当输入可能来自不可信来源如用户提交的 URL时保留url.crawl.ssrf的默认策略避免内部服务被当作跳板本地路径类输入不触发爬取路径不受此影响。注意 JSON 字段命名。所有绑定的对外协议均为 snake_caseKotlin 侧务必配置 SNAKE_CASE 命名策略否则mime_type、page_count等字段会映射失败造成看似成功实则空结果的假象。相关文件速查契约用例定义与断言fixtures/batch/extract_batch_uri_not_found.jsonKotlin/Android 示例片段本文主体来源docs-site/src/snippets-generated/kotlin-android/batch/extract_batch_uri_not_found.mdextractBatch绑定实现Xberg.kt输入模型定义ExtractInput.kt结果与批级统计ExtractionResult.kt、ExtractionSummary.ktSSRF 策略的 C FFI 暴露xberg.h同一契约在仓库的其余 14 种绑定Java、Swift、Go、Python、Ruby、Rust、C#、Dart、Elixir、PHP、TypeScript、Wasm、Zig、C中均有对应片段见 docs-site/src/snippets-generated 下各语言目录本指南的语义与实现路径同样适用于它们——差异仅在于各语言的 JSON 映射方式与调用语法。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg Java 批量提取容错实战extractBatch 处理不存在的 URI 输入xberg Java 批量提取容错实战extractBatch 处理不存在的 URI 输入 本文围绕 xberg 官方契约示例 extract_batch_u后端AI 应用NLPKotlin/Android 中调用 Xberg extractBatch 批量 URI 文档抽取的完整实践指南Kotlin/Android 中调用 Xberg extractBatch 批量 URI 文档抽取的完整实践指南 导读 本文以 Xberg 项目 Kotlin/后端AI 应用NLPGo 批量抽取的部分失败处理xberg ExtractBatch 在 URI 输入损坏时的容错实践Go 批量抽取的部分失败处理xberg ExtractBatch 在 URI 输入损坏时的容错实践 本篇技术指南围绕 xberg 文档库中 extract_b后端AI 应用NLP上一篇formily/reactive observe API 详解操作级监听、深/浅监听与变更事件模型下一篇RedwoodJS 实战用 dbAuth 为博客应用构建完整认证体系路由保护、登录注册与会话安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表