Java服务器无法解析来自protobuf byte []

时间:2014-10-16 20:07:28

标签: java post encoding protocol-buffers libcurl

我使用来自c ++客户端的libcurl来将帖子数据提交给java服务器。 由于某种原因,无法在服务器端解析发布数据(protobuf SerializeToString)。

以下是客户端部分:

string str;
ProtoBufMessage.SerializeToString(&str);
curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str);
curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDSIZE, str.size());

这是服务器上的Java代码:

@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public @ResponseBody
byte[] updateStatus( @RequestBody byte[] message) {
    try {
       ProtobufMessage pbMessage = ProtobufMessage.parseFrom(message);

    ...

}

当我将消息转换为字符串时,我得到以下值 - “%C3%B4%C3%BA%29%00%00%00%00%00%C3%BD%C3%BD%C3% BD%C3%BD%C2%AB%C2%AB%C2%AB%C2%AB%C2%AB%C2%AB =“

但是,客户端发送以下值 - “\ b \ x1 \ x1a \ xe \ n \ x5Hello \ x12 \ x5world”

我认为它与传输字节的编码有某种关系,但我该如何控制呢?

此外,这是我在服务器端获取的异常,同时解析消息 - com.google.protobuf.InvalidProtocolBufferException:协议消息end-group标记与预期标记不匹配。

1 个答案:

答案 0 :(得分:0)

根据this documentationCURLOPT_POSTFIELDS的参数必须为char*。你传递的是std::string。您没有收到编译错误,因为curl_easy_setopt是一个c样式的vararg函数,它没有类型检查。

将行更改为:

curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str.data());

另一个可能的问题是libcurl将使用Content-Type: application/x-www-form-urlencoded发送请求。许多Web服务器将识别此类型并尝试将其解析为表单数据。您应该将Content-Type覆盖为application/x-protobuf或者只是application/octet-stream(这意味着“字节blob”)以避免任何问题。