Запрос данных из REST API в формате JSON на C++

Вопрос или проблема

У меня есть одно приложение, где мне нужно запрашивать данные из REST API в формате Json и отправлять Json данные в облако, используя REST API на C++. Я гуглил, но нашел очень мало ресурсов.

Поскольку я нов в программировании на C++

С чего мне стоит начать,
Как использовать фиктивную базу данных для вызова JSON-сообщения через REST API

ITNOA

Если вы хотите вызвать веб-API в проекте на C++, вы можете использовать cpprestsdk1

Но cpprestsdk не активно развивается и поддерживается только, поэтому если вы хотите другую активную библиотеку для достижения связи с веб-сервисом с помощью http и json, вы можете использовать Boost.Beast в качестве клиента http и использовать JSON для современного C++ в качестве библиотеки сериализации/десериализации json.

1. C++ REST SDK — это проект Microsoft для облачной клиент-серверной связи на нативном коде с использованием современного асинхронного проектирования C++ API. Этот проект призван помочь разработчикам C++ подключаться и взаимодействовать с сервисами.

Ответ или решение

Запрос данных из REST API в формате JSON на C++ является важной задачей при разработке современных приложений. В этом ответе мы рассмотрим, как можно это осуществить с использованием популярных библиотек, таких как Boost.Beast и JSON for Modern C++.

Шаги по работе с REST API в C++

1. Выбор библиотек

Для начала вам необходимо выбрать библиотеки, которые будут использоваться для отправки HTTP-запросов и работы с JSON. Я рекомендую использовать:

  • Boost.Beast: Эта библиотека предоставляет мощные функциональные возможности для работы с HTTP и WebSocket, и является частью Boost.
  • JSON for Modern C++: Эта библиотека позволяет легко сериализовать и десериализовать данные в/из JSON.

2. Установка библиотек

Убедитесь, что у вас установлены необходимые библиотеки. Это можно сделать через пакетный менеджер vcpkg или Conan. Например, используя vcpkg:

vcpkg install boost-beast
vcpkg install nlohmann-json

3. Пример кода для получения данных из REST API

Ниже приведен пример кода, который показывает, как выполнить GET-запрос к REST API и обработать полученные данные в формате JSON:

#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/asio.hpp>
#include <nlohmann/json.hpp>
#include <iostream>

namespace beast = boost::beast;        // для удобства
namespace http = beast::http;          // для удобства
namespace net = boost::asio;           // для удобства
using json = nlohmann::json;           // библиотека для работы с JSON

int main() {
    try {
        // Создаем IO контекст
        net::io_context ioc;

        // Создаем TCP resolver
        net::ip::tcp::resolver resolver(ioc);
        // Разрешаем адрес и порт
        auto const results = resolver.resolve("api.example.com", "80");

        // Создаем сокет
        beast::tcp_stream stream(ioc);
        // Подключаемся к серверу
        stream.connect(results);

        // Создаем HTTP запрос
        http::request<http::string_body> req{http::verb::get, "/data", 11};
        req.set(http::field::host, "api.example.com");
        req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);

        // Отправляем запрос
        http::write(stream, req);

        // Получаем ответ
        beast::flat_buffer buffer;
        http::response<http::dynamic_body> res;
        http::read(stream, buffer, res);

        // Закрываем сокет
        beast::error_code ec;
        stream.socket().shutdown(net::ip::tcp::socket::shutdown_both, ec);

        if (ec && ec != beast::errc::not_connected)
            throw beast::system_error{ec};

        // Обрабатываем JSON ответ
        json responseData = json::parse(boost::beast::buffers_to_string(res.body().data()));
        std::cout << "Данные из API: " << responseData.dump(4) << std::endl;

    } catch (const std::exception& e) {
        std::cerr << "Ошибка: " << e.what() << std::endl;
    }

    return 0;
}

4. Отправка данных на облако

Теперь, когда у вас есть базовое понимание работы с REST API, следующим шагом будет отправка данных на облако. Процесс аналогичен запросу, но с использованием метода POST:

// Пример JSON-данных для отправки
json dataToSend = {
    {"name", "example"},
    {"value", 42}
};

http::request<http::string_body> postReq{http::verb::post, "/upload", 11};
postReq.set(http::field::host, "api.example.com");
postReq.set(http::field::content_type, "application/json");
postReq.body() = dataToSend.dump();
postReq.prepare_payload();

// Отправляем запрос
http::write(stream, postReq);

Заключение

Работа с REST API в C++ может показаться сложной, особенно для новичков, но благодаря мощным библиотекам как Boost.Beast и JSON for Modern C++ процесс становится значительно проще. Надеюсь, этот пример поможет вам начать интеграцию вашего приложения с REST API. Не забывайте также ознакомиться с документацией библиотек для более глубокого понимания их возможностей.

Оцените материал
Добавить комментарий

Капча загружается...