libcurl CURLOPT_WRITEDATA не записывает
Не могу записать ответ от api в CURLOPT_WRITEDATA
#define CURL_STATICLIB
#include <curl/curl.h>
#include <string>
#include <iostream>
static size_t write_data(char* ptr, size_t size, size_t nmemb, std::string* data)
{
if (data)
{
data->append(ptr, size * nmemb);
return size * nmemb;
}
else
std::cout << "error";
return 0;
}
int getIdGroop(std::string ACCESS_TOKEN, std::string VERSION, std::string LINK, std::string name) {
std::string formedLink = LINK + "groups.getById?group_ids=" + name + "&access_token=" + ACCESS_TOKEN + "&v=" + VERSION;
std::string readBuffer;
CURL* curl;
CURLcode response;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, formedLink.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
response = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (response) std::cout << readBuffer << std::endl;
else std::cout << curl_easy_strerror(response) << std::endl;
return 0;
}
int main()
{
const std::string ACCESS_TOKEN = "***";
const std::string VERSION = "5.130";
const std::string LINK = "https://api.vk.com/method/";
std::string answer;
std::string name;
std::cin >> name;
getIdGroop(ACCESS_TOKEN, VERSION, LINK, name);
system("pause");
return 0;
}
Ответы (2 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
Дело не в получении данных.
Результат запроса у вас получается
response CURLE_PEER_FAILED_VERIFICATION (60) CURLcode
Т.е. сертификат SSL не проходит верификацию в curl (как он это делает - читайте документацию).
Исправьте анализ ошибки и отключите проверку SSL:
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, formedLink.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // ОТКЛЮЧАЕМ ПРОВЕРКУ СЕРТИФИКАТА СЕРВЕРА
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
response = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (response==CURLE_OK) std::cout << readBuffer << std::endl; // Запрос отработал если код CURLE_OK
else std::cout << curl_easy_strerror(response) << std::endl;
Автор решения: Galahad
→ Ссылка
Дело было не в SSL ректификате, привел функцию к виду
static size_t write_data(char* ptr, size_t size, size_t nmemb, void* data)
{
if (data)
{
((std::string*)data)->append(ptr, size * nmemb);
return size * nmemb;
}
else
std::cout << "error";
return 0;
}
Самое не приятное, что меня запутало, в отладчике readBuffer не показывает содержимое, но если использовать функцию fing() то корректно выводит результат.