2014-10-16 35 views
0

我使用來自C++客戶端的libcurl爲了提交發布數據到java服務器。 由於某些原因,post數據(protobuf SerializeToString)無法在服務器端解析。Java服務器無法解析來自protobuf byte []

這裏是客戶端部分:

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 \ x5w orld「

我相信它與發送字節的編碼有某種關係,但是我怎麼控制它呢?

另外,這裏是我在服務器端解析消息時出現的異常 - com.google.protobuf.InvalidProtocolBufferException:協議消息結束標記標記與預期標記不匹配。

回答

0

根據this documentationCURLOPT_POSTFIELDS的參數需要爲char*。您正在傳遞std::string。您不會收到編譯錯誤,因爲curl_easy_setopt是一種c型可變參數函數,它沒有類型檢查。

行更改爲:

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」)以避免任何問題。

+0

我將其更改爲str.data(),但真正的問題與C++和java之間的序列化有關(所以我最終編譯了該消息的base64編碼)。謝謝 – user2895378 2014-10-19 12:55:26

相關問題