【问题标题】:Using Libcurl to send very large strings to a server using REST API?使用 Libcurl 将非常大的字符串发送到使用 REST API 的服务器?
【发布时间】:2013-03-18 10:20:22
【问题描述】:

我正在尝试使用 REST API 将非常大的字符串(最大 16GB)发送到云服务器(类似于 AWS)以存储为文件。我想以较小的块将字符串流式传输到服务器,并且字符串块将即时生成。据我所知,将传输编码设置为“分块”将帮助我做到这一点。我已经开始使用 libcurl 库编写一个 C++ 程序来执行此操作。这是一个带有简化测试字符串的相关 sn-p:

headers = curl_slist_append(headers, "Accept: text/plain");
headers = curl_slist_append(headers, "Content-Type: binary/octet-stream");
headers = curl_slist_append(headers, "Transfer-Encoding: chunked");

curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.1:8080/namespace/test/test");

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "5/r/nHELLO/r/n");
curl_res = curl_easy_perform(curl);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "3/r/nBYE/r/n");
curl_res = curl_easy_perform(curl);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "0/r/n");
curl_res = curl_easy_perform(curl);

根据我对分块传输的理解,每个块应该以十六进制数字表示的字符串大小开头,然后是实际字符串。当遇到大小为零时,服务器知道传输已完成 (http://en.wikipedia.org/wiki/Chunked_transfer_encoding)。但是,当我在执行上述操作后查看文件的内容时,我看到的只是“0”而不是“HELLOBYE”。因此,它不仅会在每次块传输时覆盖文件,还会将字符串的大小解释为字符串的一部分。

所以我的问题归结为:

  1. 如何让它将我的块传输的第一部分解释为字符串的大小?
  2. 如何让它“连接”顺序块传输?

【问题讨论】:

  • 您不应多次调用easy_perform,并让libcurl 准备POST 数据(libcurl 在内部处理以块的形式追加数据的能力)。我建议您参考说明分块传输编码的post-callback.c 示例。

标签: c++ http rest networking libcurl


【解决方案1】:

稀薄。不知道我的回答能不能解决你的问题。但是请尝试一下并分享更改后的结果。

在 curl 中添加如下配置:

curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0);

这样做的原因是 libcurl 默认会为你解码块。

也许让我为您提供更多帮助的更好方法是发布您的网络标头和由wireshark捕获的数据?否则真的很难调试网络编程。

另一方面,我认为主要问题在于 libcurl。因此,我强烈建议您在curl library mail listing 下注册一个 curl 邮件列表,以便将您的查询广播给这些专家。它会让你受益匪浅。

【讨论】:

    【解决方案2】:

    这很容易用 libcurl 完成,但是你应该让 libcurl 完成整个请求,你应该只给它提供数据以一点一点地发送。 curl 网站上的 post-callback.c 示例几乎正是您所要求的。

    关键是设置正确的标头,然后使用读取回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多