Curlpp,来自请求的不完整数据

时间:2012-05-14 14:21:30

标签: c++ curl curlpp

我正在使用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网站消失了)。

2 个答案:

答案 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);