Использование CURL в C ++ / C для отправки HTTP-запроса GET с файлом данных - PullRequest
1 голос
/ 26 мая 2020

Использование CURL в командной строке:

curl -d @% 1 -X GET https://blah-blah

Это в пакетном файле Windows и я передаю имя файла в командной строке. Используя это, я могу отправить служебный вызов в файл с большим количеством входных параметров, и я получаю существенный результат.

Да хоть убей, когда я пытаюсь программно, я не могу сделай так, чтобы это работало. Это должно быть возможно, поскольку это можно сделать по команде. Однако, когда я устанавливаю

curl_easy_setopt(m_Curl, CURLOPT_HTTPGET, 1);

, я не могу загрузить файл, даже если я установил обратный вызов

Если я использую:

curl_easy_setopt(m_Curl, CURLOPT_UPLOAD, 1L);

, вызов становится 'PUT', даже если я пытаюсь заставить заголовок быть GET. Я следую документации и вижу, что это задокументированное поведение. Тем не менее, как можно избежать этого значения по умолчанию?

Любые указания будут очень благодарны.

Спасибо,

Stan

1 Ответ

1 голос
/ 26 мая 2020

AFAIK это не строго запрещено, но вы не должны отправлять тело с запросом GET. С другой стороны, сервер должен иметь возможность обрабатывать запрос GET с телом, но ответ не должен зависеть от содержимого тела.

Если вам действительно нужно отправить запрос, содержащий тело, с помощью GET вы можете изменить значение метода с помощью CURLOPT_CUSTOMREQUEST. Это не изменит поведения curl. Этот фрагмент загрузит данные с помощью GET:

  CURL* curl = curl_easy_init();
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_PORT, port);
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");

    const auto* file = fopen(filename.c_str(), "r");
    curl_easy_setopt(curl, CURLOPT_READDATA, file);
    curl_easy_setopt(
        curl, CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(filesize));

    curl_easy_perform(curl);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...