使用 curl 向 /{db} 插入一篇带“type:user”字段的 JSON 文档并拿到 201 状态码的完整命令?

解读

国内一线/二线互联网公司在现场或视频面试中,常把“用 curl 写一条插入”作为 CouchDB 基础实操题。
面试官关注的不是你会不会敲命令,而是能否一次性给出可复现、无语法错误、返回 201 且包含明确 type:user 字段的完整语句;同时默认你已具备权限、数据库已存在、Content-Type 正确、JSON 合法、id 策略清晰。
任何漏写 -H、漏写引号、id 冲突、大小写错误都会导致 400/409/415,直接扣分。

知识点

  1. CouchDB 插入即PUT /{db}/{docid}(指定 id)或 POST /{db}(由 UUID 生成 id);两者成功都返回 201。
  2. 必须显式声明 Content-Type: application/json,否则 415。
  3. 返回码 201 表示“已创建”,响应头 Location 指向新文档。
  4. 字段 type 为用户自定义,写成 "type":"user" 即可,CouchDB 不强制 schema。
  5. curl 在 Linux/Mac 下单引号包 JSON最稳;Windows PowerShell 需改双引号并转义内部双引号。
  6. 国内镜像或云厂商 CouchDB 往往开Basic 认证,需 -u user:pass;面试时如未提及可省略,但应口头补充“生产环境需加认证”。
  7. 若用 PUT,id 不能重复;若重复且不带 _rev 会 409;面试场景建议POST 让服务器生成 id,降低心智负担。

答案

以下命令在 Linux/Mac 终端直接执行可稳定拿到 201(假设数据库 demo 已存在,无认证):

curl -X POST http://127.0.0.1:5984/demo
-H "Content-Type: application/json"
-d '{"type":"user","name":"张三","age":28}'

执行后终端返回: {"ok":true,"id":"5f6bf1c8e7e9c52a9f8b6e7c9a0001f2","rev":"1-967a00dff5e02add41819138abb3294e"}

状态码 201 可通过加 -v 或 -w "%{http_code}" 验证。

拓展思考

  1. 幂等性对比:PUT 必须带 id,重复执行需附最新 _rev 才能更新;POST 每次产生新 id,天然幂等插入。
  2. 批量性能:生产环境用 _bulk_docs API 一次性提交百条,可减少 RTT 与 HTTP 连接开销。
  3. 权限加固:国内公有云 CouchDB 常关匿名写,需先 curl -u admin:password -X PUT http://ip:5984/_node/nonode@nohost/_config/admins/admin -d '"password"' 创建管理员,再在命令中加 -u 参数。
  4. 移动端同步:type:user 文档后续可通过 _changes feed 与 PouchDB 离线同步,面试可延伸“如何设计同步网关、冲突解决策略”。
  5. 数据合规:用户数据含手机号时需加密存储,国内需满足《个人信息保护法》,面试可提及“在写入前对敏感字段做 AES 加密,再存进 CouchDB”。