如何用Ruby将Avro二进制数据适配vnd.kafka.binary.v1+json端点调用?
回答:不是的,直接用
envBuffer.string.to_json_raw_object无法正确调用该端点 你需要遵循Kafka REST Proxy针对vnd.kafka.binary.v1+json格式的要求来处理数据,具体步骤和原因如下:
为什么你的当前做法不对
envBuffer.string是Avro编码后的原始二进制字节流,直接将其转成JSON对象会导致不可打印字符被破坏或序列化异常——JSON本身不支持原生二进制数据,必须通过编码转换才能安全嵌入JSON结构中。
正确的处理步骤
Kafka的二进制JSON格式要求将Avro二进制数据做Base64编码,然后放入特定的JSON结构里,具体Ruby代码示例如下:
# 1. 获取Avro编码后的二进制数据 avro_binary_data = envBuffer.string # 2. 对二进制数据进行Base64编码(必须用严格模式避免换行) base64_encoded_value = Base64.strict_encode64(avro_binary_data) # 3. 构建符合Kafka REST要求的请求 payload kafka_payload = { records: [ { value: base64_encoded_value # 如果你的消息需要key,同样对key的Avro二进制数据做Base64编码后添加: # key: base64_encoded_key } ] } # 4. 将payload序列化为JSON字符串,用于发送请求 request_body = kafka_payload.to_json
发送请求的注意事项
- 必须设置请求头
Content-Type: vnd.kafka.binary.v1+json,否则端点无法正确解析你的数据 - 确保你使用的Avro Schema(
envSchema)与Kafka主题对应的Schema完全一致,否则会出现解码失败 - 如果需要批量发送多条消息,只需在
records数组中添加更多包含value(或key)的对象即可
内容的提问来源于stack exchange,提问作者Oggie
相关产品推荐
相关产品推荐

