如何在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字段携带认证信息
相关操作截图:

内容的提问来源于stack exchange,提问作者MyhreS
相关产品推荐
相关产品推荐

