我正在使用Curlpp向各种web服务发送请求以发送和接收数据。 到目前为止,这个工作正常,因为我只用它来发送/接收JSON数据。
现在我的情况是webservice以二进制形式返回一个zip文件。这是我遇到的问题,其中收到的数据不完整。
我首先让Curl设置通过使用选项WriteStream将任何数据写入ostringstream,但事实证明这不是正确的方法,因为数据包含空字符,因此数据在第一个空字符处停止。
之后,我使用WriteFunction而不是使用WriteStream,而是使用回调函数。 在这种情况下的问题是,无论数据量如何,此函数总是被调用2或3次。 这导致总是有一些数据块似乎不是文件的第一部分,尽管数据总是包含PK作为前2个字符,表示一个zip文件。
我使用了几个工具来验证数据是否完全发送到我的应用程序,因此这不是Web服务的问题。
这里的代码。请注意,主机名,端口,标题和后置字段等选项都设置在其他位置。
string requestData;
size_t WriteStringCallback(char* ptr, size_t size, size_t nmemb)
{
requestData += ptr;
int totalSize= size*nmemb;
return totalSize;
}
const string CurlRequest::Perform()
{
curlpp::options::WriteFunction wf(WriteStringCallback);
this->request.setOpt( wf );
this->request.perform();
return requestData;
}
我希望任何人都可以帮助我解决这个问题,因为我已经对如何解决这个问题一无所知,也因为curlpp文档记录很差(更糟糕的是因为curlpp网站消失了)。
答案 0 :(得分:2)
代码的问题在于数据被放入std :: string,尽管数据是二进制(ZIP)格式。我建议将数据放入流(或二进制数组)。
您还可以注册回调以检索响应头,并根据"Content-type"
在WriteCallback中执行操作。
curlpp::options::HeaderFunction
注册回调以检索响应标头。
答案 1 :(得分:1)
std::string
不是问题,但连接是:
requestData += ptr;
C string(ptr)以零结尾,如果输入包含任何零字节,则输入将被截断。您应该将其包装成一个知道其数据长度的字符串:
requestData += std::string(ptr, size*nmemb);