通过 HTTP Range 请求获取附件前 1 KB 数据的 curl 示例?

解读

面试官想确认三件事:

  1. 是否知道 CouchDB 附件(attachment)本质是普通 HTTP 资源,可直接用 Range 头做分块下载
  2. 能否拼出带鉴权符合国内生产环境习惯的 curl 命令;
  3. 是否理解 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。

拓展思考

  1. 若附件存储在 S3 兼容对象存储(国内用腾讯云 COS 或 MinIO),CouchDB 只会返回 302 重定向,此时 Range 头需发给对象存储,命令里要加 -L 跟随跳转。
  2. 移动端弱网场景,可循环递增 Range 起止,实现断点续传;前端用 PouchDB 时,底层复用同一逻辑,保证离线优先体验。
  3. 安全合规:国内等保 2.0 要求“传输完整性”,建议给 Nginx 层开启 TLS1.3 + AEAD 加密,并限制 Range 长度防止恶意Range-Based DoS
  4. 监控:在 Prometheus 中抓取 couchdb_httpd_range_requests_total 指标,若 206 响应占比突降,需检查是否有人误关 enable_range_requests 配置(企业版默认开启)。