Введение в запросы к API в C++
Веб-API часто отвечает не HTML, а текстом JSON.
Клиент libcurl получает его как обычную строку в теле
ответа, после чего ту же строку передают методу
nlohmann::json::parse из заголовка
nlohmann/json.hpp.
Публичный каталог jsonplaceholder.typicode.com
отдает записи пользователей. Достаточно одного чтения
по адресу "/users/1", затем разбор только
нужных полей:
#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://jsonplaceholder.typicode.com/users/1"
);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
nlohmann::json user = nlohmann::json::parse(body);
std::cout << user.at("id").get<int>() << "\n";
std::cout << user.at("name").get<std::string>() << "\n";
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}
В тексте от сервера есть и другие ключи - почта, адрес,
компания. Достаточно читать только id и
name через at, лишние поля
остаются в дереве, но программа их не трогает.
Тот же прием работает, если нужны идентификатор и почта вместо имени - лишние ключи по-прежнему не мешают:
#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://jsonplaceholder.typicode.com/users/1"
);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
nlohmann::json user = nlohmann::json::parse(body);
std::cout << user.at("email").get<std::string>() << "\n";
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}