You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scala对接etcd时使用HttpDelete、HttpPut实现数据操作

Scala 操作 etcd 写入、删除功能解决方案

etcd v3 版本的 HTTP API 基于 gRPC 网关实现,所有操作均使用 POST 方法调用对应接口路径,直接使用 httpPut、httpDelete 访问 key 路径不符合接口规范,这是请求失败的核心原因。

写入数据实现(对应 put 操作)

调用路径为 /v3/kv/put,请求体中携带的 key、value 均需要先做 Base64 编码,Scala 示例代码如下(以 sttp 客户端为例,其他 HTTP 客户端逻辑一致):

import java.util.Base64
import sttp.client3._

// 替换为你的etcd服务地址
val etcdServer = "http://127.0.0.1:2379"
val putApi = s"$etcdServer/v3/kv/put"

// key、value 必须转为Base64编码
val encodeKey = Base64.getEncoder.encodeToString("testDistrict".getBytes("UTF-8"))
val encodeValue = Base64.getEncoder.encodeToString("你要写入的全量数据内容".getBytes("UTF-8"))

val resp = basicRequest
  .post(uri"$putApi")
  .body(s"""{"key":"$encodeKey","value":"$encodeValue"}""")
  .send(DefaultSyncBackend())

如果需要返回修改前的旧值,可在请求体中添加 "prev_kv": true 参数。

删除数据实现(对应 delete 操作)

调用路径为 /v3/kv/deleterange,示例代码如下:

import java.util.Base64
import sttp.client3._

val etcdServer = "http://127.0.0.1:2379"
val deleteApi = s"$etcdServer/v3/kv/deleterange"

val encodeKey = Base64.getEncoder.encodeToString("testDistrict".getBytes("UTF-8"))
// 单个key删除请求体
val reqBody = s"""{"key":"$encodeKey"}"""
// 若需删除指定前缀的所有key,新增range_end参数,值为前缀最后一位字符ASCII码+1后的Base64编码即可
// 例:删除所有test开头的key,range_end为Base64.getEncoder.encodeToString("tesu".getBytes)

val resp = basicRequest
  .post(uri"$deleteApi")
  .body(reqBody)
  .send(DefaultSyncBackend())

排查注意事项

  • 所有请求均使用 POST 方法,不要直接用 PUT/DELETE 请求 key 路径
  • key、value 等参数必须做 Base64 编码,否则会返回参数校验错误
  • 若 etcd 开启了身份认证,需在请求头中添加 Authorization 字段携带认证信息

相关操作截图:
操作截图1
操作截图2

内容的提问来源于stack exchange,提问作者MyhreS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:03:03