我使用来自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标记与预期标记不匹配。
答案 0 :(得分:0)
根据this documentation,CURLOPT_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”)以避免任何问题。