Java服务器无法从protobuf字节[]解析 < >我使用C++客户机的libCURL,以便向java服务器提交帖子数据。 由于某些原因,无法在服务器端解析post数据(protobuf SerializeToString)
以下是客户端部分:Java服务器无法从protobuf字节[]解析 < >我使用C++客户机的libCURL,以便向java服务器提交帖子数据。 由于某些原因,无法在服务器端解析post数据(protobuf SerializeToString),java,post,encoding,protocol-buffers,libcurl,Java,Post,Encoding,Protocol Buffers,Libcurl,以下是客户端部分: 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_ST
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%C3%BD%C3%BD%C3%BD%C2%AB%C2%AB%C2%AB%C2%AB%AB%C2%C2%AB=”
但是,客户端正在发送以下值-“\b\x1\x1a\xe\n\x5Hello\x12\x5world”
我相信这与传输字节的编码有关,但我如何控制它呢
另外,在解析消息时,我在服务器端遇到了一个异常-
com.google.protobuf.InvalidProtocolBufferException:协议消息结束组标记与预期标记不匹配。根据,CURLOPT\u POSTFIELDS
的参数需要是char*
。您正在传递一个std::string
。您不会得到编译错误,因为curl\u easy\u setopt
是一个c风格的vararg函数,它没有类型检查
将行更改为:
curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str.data());
这里还有一个可能的问题,libcurl将使用内容类型发送请求:application/x-www-form-urlcoded
。许多web服务器会识别这种类型,并尝试将其作为表单数据进行解析。你应该把<代码>内容类型< /C> >覆盖到代码>应用程序/X-ToBuff,或者可能只是<代码>应用程序/八位字节流>代码(这意味着“字节BLB”)以避免任何问题。我将它改为STRATDATA(),但真正的问题与C++和java之间的序列化有关(所以我最终对BASE64编码了消息)。谢谢