c - 如何使用Curlpp写入json数据文件?

标签 c json libcurl curlpp

命令行选项正在工作,下面是工作环请求

curl -s -H "Content-Type: application/json"   https://speech.googleapis.com/v1/speech:recognize?key=apikey -d @sync-request.json

我尝试使用 libcurl 执行相同操作,添加 json 数据文件失败... 在curl::PostFields 中直接将json 数据作为字符串传递时工作。

在下面的示例中,apikey 替换为 mydev key 。 对于大文件大小需要此选项。

#include <iostream>
 #include <curlpp/Options.hpp>
 #include <curlpp/Easy.hpp>
 #include <curlpp/cURLpp.hpp>
 #include <sstream>
 #include <future>
 #include <curlpp/Exception.hpp>
 #include <cstdlib>
 #include <cstdio>
 #include <cstring>
 #include <cerrno>

    size_t WriteCallback(char* ptr, size_t size, size_t nmemb, void *f)
    {
        FILE *file = (FILE *)f;
        cout<<"file write"<<endl;
        return fwrite(ptr, size, nmemb, file);
    }

    std::future<std::string> invoke(std::string const& url) {
      return std::async(std::launch::async, 
        [](std::string const& url) mutable {
          std::list<std::string> header;
          header.push_back("Content-Type: application/json");

          FILE* file = fopen("sync-request.json", "wb");
          curlpp::options::WriteFunctionCurlFunction  myFunction(WriteCallback);
          curlpp::OptionTrait<void *, CURLOPT_WRITEDATA> myData(file);

          curlpp::Cleanup clean;
          curlpp::Easy r;
          r.setOpt(new curlpp::options::Url(url));
          r.setOpt(new curlpp::options::HttpHeader(header));
          r.setOpt(myFunction);
          r.setOpt(myData);

          std::ostringstream response;
          r.setOpt(new curlpp::options::WriteStream(&response));

          r.perform();
          std::cout<<std::string(response.str());
          return std::string(response.str());
        }, url);
    }
    int main(int argc, char **argv) {
        invoke("https://speech.googleapis.com/v1/speech:recognize?key=apikey");
        return 0;
    }

抛出错误

  <p>The requested URL <code>/v1/speech:recognize?key=apikey</code> was not found on this server.

最佳答案

如果您将 Json 文件内容加载到字符串中,则只需将数据设置为 POST 负载即可。

    string payload = json.data();
    [...]
    request.setOpt(new curlpp::options::PostFields(payload));
    request.setOpt(new curlpp::options::PostFieldSize(payload.length()));
    [...]
    request.perform();

关于c - 如何使用Curlpp写入json数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48642915/

相关文章:

http - 为什么现代 curl 版本会切断 URL 的#anchor 部分?

c++ - 不得删除 C++ 或 C 运算符之间的空格的示例

c - 如何输入数组

java - 如何使用 Spring RestTemplate 将 Riot Api 请求映射到对象

objective-c - 为什么在 iPhone 中从服务器发送和接收 JSON 数据这么慢?

C++ 是否在多个文件单元中链接相同的静态库会增加大小/膨胀?

c# - C# 和 .NET 中的 libcurl

c - 域名解析

c - 为什么 fread() 在文件读取期间失败?

java - Play Controller 不接受 JSON POST