Как загрузить файл и данные JSON с помощью метода POST, используя curlpp - PullRequest
0 голосов
/ 31 октября 2018

Я хочу написать код C ++ с использованием библиотеки curlpp, которая работает точно так же, как в следующем примере на curl, если это возможно, конечно.

> curl -H "Content-Type: application/json" -X POST -d '{"param1":"val1", "param2":"val2", "param3":"val3"}' --data-binary '@/tmp/somefolder/file.bin' https://my-api.somedomain.com:1024/my_command_url
>

Мне удалось написать текст JSON для переноса методом POST, но когда я добавил команду загрузки, эта библиотека заменила PUT вместо POST.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я попытался использовать опубликованный ответ, но обнаружил, что он плохо работает с экспресс-анализатором json и каждый раз выдает неверный запрос. Я думаю, что использование данных формы curlpp, скорее всего, лучший вариант. Посмотрите код ниже для базового примера отправки строки json и файла в форме:

std::string BasicFormDataPost(std::string url, std::string body1, std::string filename)
{
  std::ostringstream result;
  try
  {
  // Initialization
  curlpp::Cleanup cleaner;
  curlpp::Easy request;
  curlpp::Forms formParts;
  formParts.push_back(new curlpp::FormParts::Content("formjson",body1)); // One has to remember to JSON.parse on the server to use the body data.
  formParts.push_back(new curlpp::FormParts::File("attachment", filename));

  using namespace curlpp::Options;

  // request.setOpt(new Verbose(true));
  request.setOpt(new Url(url));
  request.setOpt(new HttpPost(formParts));
  request.setOpt(WriteStream(&result));
  request.perform();
  return std::string( result.str());  
 }
 catch ( curlpp::LogicError & e )
 {
   std::cout << e.what() << std::endl;
 }
 catch ( curlpp::RuntimeError & e )
 {
   std::cout << e.what() << std::endl;
 }

}

Этот ответ был составлен из предыдущего ответа и примеров curlpp, расположенных по адресу: https://github.com/datacratic/curlpp/tree/master/examples

0 голосов
/ 01 ноября 2018

Я решил опубликовать ответ здесь, возможно, это поможет кому-то вроде меня

static string post_request(const string url,const string body1,const string path2file)
{
   const string field_divider="&";
   stringstream result;
   try
   {
      using namespace std;

      // This block responsible for reading in the fastest way media file
      //      and prepare it for sending on API server
      ifstream is(path2file);
      is.seekg(0, ios_base::end);
      size_t size=is.tellg();
      is.seekg(0, ios_base::beg);
      vector<char> v(size/sizeof(char));
      is.read((char*) &v[0], size);
      is.close();
      string body2(v.begin(),v.end());

      // Initialization
      curlpp::Cleanup cleaner;
      curlpp::Easy request;
      list< string > headers;
      headers.push_back("Content-Type: application/json");
      headers.push_back("User-Agent: curl/7.77.7");

      using namespace curlpp::Options;

      request.setOpt(new Verbose(true));
      request.setOpt(new HttpHeader(headers));
      request.setOpt(new Url(url));
      request.setOpt(new PostFields(body1+field_divider+body2));
      request.setOpt(new PostFieldSize(body1.length()+field_divider.length()+body2.length()));
      request.setOpt(new curlpp::options::SslEngineDefault());
      request.setOpt(WriteStream(&result));
      request.perform();
   }
   catch ( curlpp::LogicError & e )
     {
       cout << e.what() << endl;
     }
   catch ( curlpp::RuntimeError & e )
     {
       cout << e.what() << endl;
     }

   return (result.str());

}
...