ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

在 Kotlin (Android) 中使用 Xberg 提取 gzip 编码的远程文档

在 Kotlin (Android) 中使用 Xberg 提取 gzip 编码的远程文档 后端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 的 URL 提取能力如何在 KotlinAndroid环境下通过extract入口直接抓取一个以 gzip 压缩传输的远程文档HTTP 响应携带Content-Encoding: gzip并在不手动解压的前提下拿到正文内容与远程 URL 摘要。读完本文你将掌握ExtractInput、ExtractionConfig与UrlExtractionConfig的 JSON 序列化用法理解mode取值Auto/Document/Crawl对抓取行为的影响以及仓库内对应的压缩处理与安全边界实现。场景定位URL 提取中的 gzip 传输编码现代 Web 服务器普遍使用 gzip或 br、deflate压缩 HTTP 响应以节省带宽。当远程文档本身是普通文本、HTML 或 PDF但传输层携带Content-Encoding: gzip响应头时客户端若不解压将得到一串乱码。Xberg 的 URL 摄取路径会在抓取阶段自动处理传输层编码因此调用方无需关心解压细节——这是本指南对应用例extract: remote document served gzip-encoded要验证的核心行为。该场景对应的 e2e 契约定义位于 fixtures/url/url_gzip_encoded_document.json{ mock_responses: [ { path: /, method: GET, status_code: 200, headers: { content-type: text/plain; charsetutf-8, content-encoding: gzip }, body_inline: Remote document hello from Xberg URL e2e. ... } ], extract_input: { kind: uri, uri: $mock_url }, config: { url: { mode: document } }, assertions: [ { type: not_error }, { type: contains, field: results[0].content, value: Remote document hello }, { type: equals, field: summary.remote_urls, value: 1 } ] }契约断言了三点调用不报错not_error解压后的正文可被检索到results[0].content包含原文summary.remote_urls精确等于 1。也就是说gzip 传输编码在抓取层被透明解压最终提取结果与直接抓取未压缩文档完全一致。KotlinAndroid调用示例逐行拆解关联文档给出的核心代码片段位于 docs-site/src/snippets-generated/kotlin-android/url/url_gzip_encoded_document.md是一个可在 Android 侧运行的完整 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 input mapper.readValue({\kind\:\uri\,\uri\:\https://example.com\}, ExtractInput::class.java) val config mapper.readValue({\url\:{\crawl\:{\ssrf\:{}},\mode\:\document\}}, ExtractionConfig::class.java) val result Xberg.extract(input, config) println(result.results.first().content) println(result.summary.remoteUrls) }1. Jackson 反序列化SNAKE_CASE 命名策略Xberg 的 Kotlin/Android 绑定packages/kotlin-android将 Rust 侧的序列化类型映射为 Java/Kotlin 数据类字段采用 snake_case JSON 键名。因此示例先用jacksonObjectMapper()构造 Jackson Mapper再通过setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)让ExtractInput、ExtractionConfig的 Kotlin 属性与 JSON 键自动完成命名映射。这样ExtractInput(kind uri, uri ...)就能与 Rust 侧ExtractInput的kind/uri字段一一对应。2. ExtractInput以 URI 作为输入源val input mapper.readValue({\kind\:\uri\,\uri\:\https://example.com\}, ExtractInput::class.java)kind字段取值为uri时提取引擎会走 URL 摄取路径。Rust 侧ExtractInput位于 crates/xberg/src/core/config/extraction/types.rsExtractInput定义于该文件靠前位置kind还支持bytes等其它取值用于直接传入内存字节。URI 摄取路径与本地文件的extract/extract_batch共用同一套入口相关流程说明见 docs-site/src/content/docs/guides/url-extraction.mdx。3. ExtractionConfig声明“单文档模式”val config mapper.readValue({\url\:{\crawl\:{\ssrf\:{}},\mode\:\document\}}, ExtractionConfig::class.java)配置的核心是url子对象mode: document表示把该 URI 当作单个远程文档/页面处理不进行链接爬取crawl: { ssrf: {} }是CrawlConfig中的 SSRF 策略对象{}表示采用默认策略即仅放行公开可达主机。即便在document模式下url.crawl子对象依然存在其中ssrf字段约束可访问的主机/IP 范围。从源码看UrlExtractionMode有三个取值crates/xberg/src/core/config/extraction/types.rs模式行为auto默认抓取后对 HTTP(S) 资源做分类识别document将 URI 视为单个远程文档/页面crawl从种子 URL 出发爬取逐个提取发现的页面或下载的文档4. 结果读取val result Xberg.extract(input, config) println(result.results.first().content) println(result.summary.remoteUrls)extract的签名是fun extract(input: ExtractInput, config: ExtractionConfig): ExtractionResult见 docs-site/src/content/docs/reference/api-kotlin-android.md 中extract()一节。返回的ExtractionResult中results是提取出的文档列表results.first().content为解压后的正文文本summary.remoteUrls对应 Rust 侧的summary.remote_urls即本次调用实际抓取的远程 URL 数量。对 gzip 用例而言该值恒为 1与契约断言一致。底层原理gzip 传输编码如何被透明处理抓取层的编码协商在mode document下Xberg 通过底层抓取引擎向目标 URI 发起 HTTP GET并在请求头中声明可接受的压缩编码如 gzip。服务器若返回Content-Encoding: gzip抓取层会自动解压响应体再交给文档分类与提取管线。这一过程对调用方完全透明你得到的results[0].content是解压后的原始正文。本地 gzip 文件提取的对照实现为说明压缩处理的安全设计可对照仓库内本地 gzip 文件的提取实现 crates/xberg/src/extraction/archive/gzip.rs。该模块使用flate2::read::GzDecoder解压并强制应用大小上限以防止“解压炸弹”decompression bombdecompress_gzip_limited(bytes, max_size)通过decoder.take(max_size 1)限制读取字节数解压结果超过max_archive_size时返回Gzip decompressed size exceeds ... byte limit校验错误gzip.rs解压后若检测到 TAR 头偏移 257 处的ustar魔数会委托给 TAR 提取逻辑即.tar.gz这类嵌套容器也会被自动识别gzip.rs。虽然 URL 抓取路径的传输层解压与本地归档解压属于两条不同代码路径但仓库在压缩数据处理上普遍贯彻“有限大小、拒绝膨胀”的安全原则对应归档格式的测试覆盖可参见 crates/xberg/src/extraction/archive/tests/gzip_and_limits.rs。配置参数参考UrlExtractionConfig 与安全边界UrlExtractionConfigcrates/xberg/src/core/config/extraction/types.rs除了mode与crawl还包含以下字段字段默认值作用document_url_patternNone对文档类 URL 的正则过滤max_document_urls_per_result100每次提取结果最多跟随的 URL 数max_total_urls1000单次调用跨全部结果最多跟随的 URL 数allow_local_file_inputstrue是否允许裸本地文件系统路径输入allow_file_uristrue是否允许本地file://URI 输入CrawlConfig默认值偏向“礼貌且有界”的抓取max_depth1、max_pages100、max_concurrent10、respect_robots_txttrue、stay_on_domaintrue见 types.rs。SSRF 防护处理不可信 URL 的关键抓取用户提供的 URL 本身就是一个 SSRF 攻击面。CrawlConfig.ssrfSsrfPolicy决定哪些主机与 IP 段可达在 REST/MCP 等面向调用者的入口中ssrf、proxy、max_redirects、浏览器端点等operator-owned字段会被显式拒绝——见 crates/xberg/src/core/config/request_security.rs 中validate_caller_extraction_config的实现它调用crawlberg::reject_untrusted_fields拒绝含ssrf在内的敏感抓取字段并拒绝 LLM 相关路径下的api_key、base_url、headers、providers等传输/凭据字段。实践建议对不可信种子保持respect_robots_txt与stay_on_domain开启显式设置max_pages/max_total_urls上限在服务端场景中ssrf: {}默认策略即可作为第一道防线。从契约到测试如何在仓库中验证该行为该用例属于 alef 生成的 e2e 契约snippet 文件头部注明This file is auto-generated by alef — DO NOT EDIT.level: typecheck、side_effect: server通过alef e2e generate重新生成。与之对应的契约 JSON 与断言见 fixtures/url/url_gzip_encoded_document.json同目录下还有url_crawl_linked_pages.json、url_html_page_extract.json、url_remote_text_document.json等兄弟用例覆盖 URL 提取的各类分支fixtures/url/url_batch_mixed_inputs.json — URI 与字节输入混合批量提取fixtures/url/url_crawl_linked_pages.json — 爬取模式与链接跟随fixtures/url/url_remote_text_document.json — 普通文本远程文档。你可以通过 e2e 测试框架参见 scripts/e2e/run-with-mock-server.sh启动 mock 服务器返回携带content-encoding: gzip头的响应体来复现该场景验证results[0].content与summary.remoteUrls的断言。小结在 KotlinAndroid中提取 gzip 编码的远程文档只需三步用 SNAKE_CASE 策略的 Jackson Mapper 反序列化ExtractInputkinduri与ExtractionConfigurl.modedocument、url.crawl.ssrf{}调用Xberg.extract再从results.first().content与summary.remoteUrls读取结果。传输层 gzip 由抓取引擎自动解压无需调用方介入涉及不可信 URL 时务必保留 SSRF 默认策略并设置明确的抓取上限。赞分享后端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点击查看免费下载相关推荐CANN基础设施SIG详解面向开源项目的开发者与用户服务平台CANN基础设施SIG详解面向开源项目的开发者与用户服务平台 CANN 社区基础设施 SIGSpecial Interest Group是 CANN 开源后端AI 应用NLPXberg C 绑定实战从 gzip 编码的远程文档中提取文本Xberg C 绑定实战从 gzip 编码的远程文档中提取文本 本文基于 Xberg 的 C 绑定讲解如何通过 XbergConverter.Extract后端AI 应用NLP在 KotlinAndroid中使用 Xberg 递归提取 URL 文档链接在 KotlinAndroid中使用 Xberg 递归提取 URL 文档链接 递归 URL 提取recursive URL extraction是 Xb后端AI 应用NLP上一篇Gromit-MPX与同类工具对比为什么它是Linux最佳屏幕标注工具下一篇3步搞定CATIA自动化pycatia完整教程让设计效率翻倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表