通过 HTTP Range 请求获取附件前 1 KB 数据的 curl 示例?
解读
面试官想确认三件事:
- 是否知道 CouchDB 附件(attachment)本质是普通 HTTP 资源,可直接用 Range 头做分块下载;
- 能否拼出带鉴权且符合国内生产环境习惯的 curl 命令;
- 是否理解 Range 单位是字节,1 KB 对应 0-1023,且要处理206 Partial Content响应。
知识点
- CouchDB 附件 URL 固定格式:
http(s)://{user}:{pwd}@{host}:{port}/{db}/{docId}/{attName} - Range: bytes=0-1023 触发服务端返回前 1024 字节;CouchDB 底层使用 Erlang 的 MochiWeb,完整支持 HTTP/1.1 Range。
- 国内机房常关掉了 80/5984 外网,需通过 Nginx 反向代理 + HTTPS 443 端口访问,curl 要加
-k忽略自签证书。 - 若附件大于 64 MB,建议继续用 Range 分片,避免一次拉满造成移动网络掉线。
- 返回码区别:206 表示 Range 成功;200 表示服务端忽略 Range(老版本配置问题),需日志排查。
答案
# 国内常见 HTTPS + 自签证书场景,获取前 1 KB
curl -k -H 'Range: bytes=0-1023' \
-u 'couchuser:yourStrongPwd' \
https://db.example.com:443/mydb/abc123/report.pdf \
-o report_head.bin
解释:
-k 跳过证书校验;-u 做 Basic 鉴权;Range: bytes=0-1023 精确取前 1024 字节;成功时 HTTP 状态为 206 Partial Content,文件保存为 report_head.bin。
拓展思考
- 若附件存储在 S3 兼容对象存储(国内用腾讯云 COS 或 MinIO),CouchDB 只会返回 302 重定向,此时 Range 头需发给对象存储,命令里要加
-L跟随跳转。 - 移动端弱网场景,可循环递增 Range 起止,实现断点续传;前端用 PouchDB 时,底层复用同一逻辑,保证离线优先体验。
- 安全合规:国内等保 2.0 要求“传输完整性”,建议给 Nginx 层开启 TLS1.3 + AEAD 加密,并限制 Range 长度防止恶意Range-Based DoS。
- 监控:在 Prometheus 中抓取 couchdb_httpd_range_requests_total 指标,若 206 响应占比突降,需检查是否有人误关
enable_range_requests配置(企业版默认开启)。