POST и тела в формате JSON. Текст тела получают из nlohmann::json через dump.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpApPjs 662 of 696 menu
◀ ▶

Отправка JSON в C++

Создание записи на API часто требует метода POST и тела в формате JSON.

Текст тела получают из nlohmann::json через dump, а в запросе задают заголовок "Content-Type: application/json" через curl_slist. Учебный "/posts" на typicode принимает черновик с userId, title и body:

#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() { nlohmann::json draft; draft["userId"] = 1; draft["title"] = "Note"; draft["body"] = "Short text"; std::string payload = draft.dump(); curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); struct curl_slist* headers = nullptr; headers = curl_slist_append( headers, "Content-Type: application/json" ); std::string body; curl_easy_setopt( curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts" ); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload.c_str()); 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 saved = nlohmann::json::parse(body); std::cout << saved.at("id").get<int>() << "\n"; std::cout << saved.at("title").get<std::string>() << "\n"; } curl_slist_free_all(headers); curl_easy_cleanup(curl); curl_global_cleanup(); return res == CURLE_OK ? 0 : 1; }

Массив чисел кодируют так же, как одиночный объект, и передают одной строкой. Ответ typicode можно сохранить целиком и вывестем для проверки:

#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() { nlohmann::json numbers = nlohmann::json::array(); for (int value = 1; value <= 5; ++value) { numbers.push_back(value); } std::string payload = numbers.dump(); curl_global_init(CURL_GLOBAL_DEFAULT); CURL* curl = curl_easy_init(); struct curl_slist* headers = nullptr; headers = curl_slist_append( headers, "Content-Type: application/json" ); std::string body; curl_easy_setopt( curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts" ); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload.c_str()); 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) { std::cout << body << "\n"; } curl_slist_free_all(headers); curl_easy_cleanup(curl); curl_global_cleanup(); return res == CURLE_OK ? 0 : 1; }

Сформируйте JSON-массив чисел от 1 до 5, отправьте его POST на "https://jsonplaceholder.typicode.com/posts" с типом "application/json". Выведите тело ответа целиком.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить