2

我正在使用 Curlpp 向各种 Web 服务发送请求以发送和接收数据。到目前为止,这工作得很好,因为我只用它来发送/接收 JSON 数据。

现在我遇到了一个 web 服务以二进制形式返回一个 zip 文件的情况。这是我遇到接收到的数据不完整的问题的地方。

我首先使用选项 WriteStream 将 Curl 设置为将任何数据写入 ostringstream,但事实证明这不是正确的方法,因为数据包含空字符,因此数据在第一个空字符处停止。

之后,我没有使用 WriteStream,而是使用带有回调函数的 WriteFunction。这种情况下的问题是这个函数总是被调用 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 网站消失后更糟)。

4

2 回答 2

2

代码的问题在于数据被放入 std::string,尽管数据是二进制 (ZIP) 格式。我建议将数据放入流(或二进制数组)中。您还可以注册一个回调来检索响应标头并根据"Content-type".

curlpp::options::HeaderFunction注册回调以检索响应标头。

于 2012-11-12T23:39:09.687 回答
1

std::string不是问题,但串联是:

requestData += ptr;

C 字符串 (ptr) 以零结尾,如果输入包含任何零字节,则输入将被截断。您应该将其包装成一个知道其数据长度的字符串:

requestData += std::string(ptr, size*nmemb);
于 2014-07-25T07:04:27.927 回答