API Reference · v0.1.4

官方接口文档

OpenReach v0.1.4 对外提供四个核心 HTTP POST 能力;官网、文档和 Skill ZIP 作为只读静态资源提供。以下参数以当前 Java DTO、Service 与安全过滤器为准。

Base URL:http://localhost:8080。所有接口路径统一位于 /api/web

POST/api/web/search

搜索网页并返回候选信息源。provider=auto 时先按 region 选择 CN / GLOBAL Route,再执行对应免费 Provider Chain。

请求参数

字段类型必填说明
querystring非空搜索关键词,最长 500 字符
limitinteger1–20,默认 10,并受服务端 max-results 限制
regionstring最长 32 字符;默认 auto(默认 CN);CN aliases 走 CN,其他显式地区走 GLOBAL;之后作为 Provider locale Hint
providerstring最长 32 字符;默认 auto;可选 bing / baidu / sogou / so360 / duckduckgo / brave
timeRangestring最长 32 字符;any / day / week / month / year,默认 any;另兼容 all/none/off/0、d/w/m/y、1d/1w/1m/1y、past_*、pd/pw/pm/py、qdr:*。指定时间范围后,auto 只执行真正支持该能力的 Provider;CN 默认 baidu → bing → duckduckgo → brave,GLOBAL 默认 bing → brave → duckduckgo → baidu。百度免费 Web 支持 day/week/month/year;Bing 免费 Web 已验证 day/week/month,year 会自动跳过 Bing;运行期按具体范围补入真正可用的 Provider。

示例

响应字段:providerqueryregiontimeRangecountlatencyMsitems[]provider=auto 时响应仍为 auto,每个 item 的 source 表示具体结果渠道。

POST/api/web/image-search

根据文本搜索图片与来源页面。v0.1.4 会继续对原始 imageUrl 做公网 URL/重定向校验和真实图片字节探测,只把当前可直接下载的被动图片格式返回给调用方。

请求参数

字段类型必填说明
querystring非空图片搜索关键词,最长 500 字符
limitinteger1–30,默认 10,并受服务端 max-results 限制
regionstring最长 32 字符;默认 auto(默认 CN);与 Web Search 共用 CN / GLOBAL Route
providerstring最长 32 字符;默认 auto;可选 bing / baidu / sogou / openverse / wikimedia

示例

curl -X POST 'http://localhost:8080/api/web/image-search' \
  -H 'Content-Type: application/json' \
  -d '{"query":"杭州西湖夜景","limit":8,"region":"auto","provider":"auto"}'

下载保证:返回的 imageUrl 已通过服务端即时下载探测;失效链接、403/404、HTML 防盗链页、伪图片以及 SVG 主动内容会被过滤。网络状态仍可能在响应之后变化,因此它表示“响应生成时可直接下载”。

验证边界:默认候选放大为 limit × 3,最多验证 60 个;单图验证超时 4 秒、最多 3 次跳转、读取最多 64 KiB,并发 6。支持 JPEG / PNG / GIF / WebP / BMP / TIFF / ICO / AVIF / HEIC 等被动图片签名。

响应 items 可包含:ranktitleimageUrlthumbnailUrlsourcePageUrlprovidersourcedomainwidthheightimageFormatlicenselicenseUrl。顶层 provider=auto 时仍返回 auto,具体图片渠道看 item 的 provider/source

POST/api/web/read

获取公网文本网页并提取标题、正文、元数据和页面链接。读取链路包含 SSRF 防护、跳转限制、浏览器导航兼容请求头与瞬时 5xx 有界重试;不用于读取调用方内网附件、图片二进制或非 80/443 服务端口。

请求参数

字段类型必填说明
urlstring公网 HTTP(S) 文本网页 URL,最长 2048 字符;仅允许 80/443,禁止私网/本机/内部附件地址与图片等二进制资源
maxCharsinteger1000–200000;服务端默认最大正文字符数为 50000

示例

curl -X POST 'http://localhost:8080/api/web/read' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://spring.io/projects/spring-boot/","maxChars":20000}'

响应字段:urlfinalUrltitlecontentcontentTypereadertruncatedlatencyMsmetadatalinks。若公网目标明确返回 403/412/521 等状态,仍保持 HTTP 502 + UPSTREAM_ERROR 兼容,同时附加 failureTypeupstreamStatusretryable,便于 Agent 判断换源还是结束重试。

POST/api/web/curl

Safe Curl 用于读取公网 HTTP(S) 的 JSON、文本和源码内容,典型场景是 GitHub REST API、raw.githubusercontent.com、公开 OpenAPI/JSON/YAML 数据源。它不是 shell curl 透传,也不允许写请求。

请求参数

字段类型必填说明
urlstring公网 HTTP(S) URL,最长 2048 字符;仅允许 80/443
methodstring仅允许 GET / HEAD,默认 GET
headersobject最多 16 个普通请求头;Authorization、Cookie、Host、X-Forwarded-*、常见 Token/API-Key 头等敏感头禁止透传
maxCharsinteger1000–200000;默认 100000,并同时受服务端最大响应字节数限制

GitHub 源码读取示例

curl -X POST 'http://localhost:8080/api/web/curl' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://raw.githubusercontent.com/changluya/openreach/main/README.md","method":"GET","maxChars":100000}'

强制安全边界:目标 URL 每一跳都先执行 SSRF 校验;禁止 localhost、RFC1918/链路本地/保留地址、云 Metadata、非 80/443 端口,并额外禁止请求 OpenReach 自身。自请求识别会综合当前请求的 Host/serverName/localAddr、本机所有网卡地址以及 OPENREACH_CURL_BLOCKED_HOSTS 配置的额外域名/通配域名,防止该接口被用于回打自身管理面或爆破自身服务。

内容边界:只接收文本类响应(text/*、JSON、XML、JavaScript、YAML/TOML 等);图片、压缩包、可执行文件等二进制内容直接拒绝。GitHub 私有仓库或需要登录/Token 的内容不应通过该接口获取。

响应字段:urlfinalUrlmethodstatusCodecontentTypebodytruncatedredirectslatencyMsheaders

安全边界

错误响应

Controller / Service 层错误包含时间戳、HTTP 状态码、错误码、traceId 和信息;安全 Filter 提前拒绝的响应也包含 traceId。所有请求响应头同时返回 X-OpenReach-Trace-Id,可用于检索持久化日志。

{
  "timestamp": "2026-08-15T03:00:00Z",
  "status": 400,
  "code": "VALIDATION_ERROR",
  "message": "query: must not be blank"
}
HTTPcode场景
400BAD_REQUEST业务参数、URL、SSRF、Provider 或内容类型等非法
400VALIDATION_ERRORBean Validation 失败,例如 query 超 500、limit 越界
400INVALID_JSONJSON 语法错误或字段类型无法反序列化
404NOT_FOUND不在公网 Allowlist 中的路径
405METHOD_NOT_ALLOWEDAPI 非 POST 或静态资源非 GET/HEAD
413PAYLOAD_TOO_LARGEJSON 请求体超过默认 64 KiB 上限
415UPLOAD_DISABLED / UNSUPPORTED_MEDIA_TYPEMultipart 上传或非 JSON Content-Type
502UPSTREAM_ERRORProvider 全部失败、无可下载图片或 Read 上游失败;Read 的明确 HTTP 失败会附带 failureType/upstreamStatus/retryable
500INTERNAL_ERROR未预期服务端异常,内部异常不会直接回显

关键配置默认值

配置默认值说明
search.max-response-bytes2 MiB单个 Web Search Provider 上游 Body 硬上限
image-search.max-response-bytes4 MiB单个 Image Provider 上游 Body 硬上限
image-search.download-max-candidates60单请求最多验证的图片候选数
image-search.download-validation-concurrency6图片可下载验证并发
read.allowed-ports80, 443Read 公网访问允许端口
curl.max-bytes2 MiBSafe Curl 单次公网文本响应字节上限
curl.max-chars100000Safe Curl 默认返回字符上限
curl.max-redirects5Safe Curl 最大跳转次数,每跳重新安全校验
curl.blocked-hosts额外声明 OpenReach 自身公网域名/别名,支持逗号分隔与通配域名
security.max-api-body-bytes65536四个 JSON API 请求体统一硬上限

Provider 默认顺序

免费搜索结果依赖公开页面结构、访问策略和网络环境,因此属于 best-effort。v0.1.4 默认链均无需 Search API Key;Openverse 与 Wikimedia 使用公开读接口。
Project & Community

源码与交流群

项目交流群

扫码交流接口接入、部署和 Provider 扩展。点击二维码可放大查看。