Отправка 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". Выведите тело
ответа целиком.