Что такое RESTful API?

Ответ

RESTful API — это интерфейс программирования приложений, построенный в соответствии с архитектурным стилем REST (Representational State Transfer). Его основная идея — представление данных и операций над ними как ресурсов, доступ к которым осуществляется через стандартные HTTP-методы.

Основные принципы REST:

  • Ресурсы: Каждая сущность (пользователь, заказ, статья) является ресурсом с уникальным идентификатором — URI (например, /api/users/42).
  • HTTP-методы для операций CRUD:
    • GET — получение ресурса или списка ресурсов.
    • POST — создание нового ресурса.
    • PUT / PATCH — полное или частичное обновление ресурса.
    • DELETE — удаление ресурса.
  • Без состояния (Stateless): Сервер не хранит состояние клиента между запросами. Каждый запрос должен содержать всю необходимую для его обработки информацию (например, токен аутентификации в заголовках).
  • Представление ресурсов: Данные передаются в стандартных форматах, чаще всего JSON или XML.

Пример клиента на C++ с использованием библиотеки cpr (обертка над libcurl):

#include <cpr/cpr.h>
#include <iostream>
#include <nlohmann/json.hpp> // Для работы с JSON

using json = nlohmann::json;

int main() {
    // 1. GET-запрос для получения данных о пользователе
    cpr::Response r = cpr::Get(cpr::Url{"https://api.example.com/users/1"});
    if (r.status_code == 200) {
        auto user_data = json::parse(r.text);
        std::cout << "User name: " << user_data["name"] << std::endl;
    }

    // 2. POST-запрос для создания нового пользователя
    json new_user = {
        {"name", "Alice"},
        {"email", "alice@example.com"}
    };
    cpr::Response post_r = cpr::Post(
        cpr::Url{"https://api.example.com/users"},
        cpr::Header{{"Content-Type", "application/json"}},
        cpr::Body{new_user.dump()}
    );
    std::cout << "Create status: " << post_r.status_code << std::endl;

    return 0;
}

Почему REST популярен? Он прост для понимания, использует вездесущий HTTP, легко интегрируется с различными языками и клиентами (браузеры, мобильные приложения, серверные сервисы), что делает его стандартом де-факто для веб-API.

Ответ 18+ 🔞

Слушай, а вот RESTful API — это, по сути, такой способ общения между программами, который построен по принципам этой вашей архитектуры REST (или, если по-русски, "передача репрезентативного состояния"). Суть в том, чтобы всё, с чем работаешь — пользователей, заказы, статьи — представить как ресурсы, и тыкать в них палкой через обычные HTTP-команды. Всё гениально и просто, как тапок.

Основные закидоны REST:

  • Всё — ресурс: Каждая штука — это ресурс со своим уникальным адресом (URI). Хочешь пользователя с id 42? Вот тебе /api/users/42, получай, хуле.
  • CRUD на минималках через HTTP:
    • GET — чтобы получить ресурс или список. Посмотреть, что есть.
    • POST — чтобы создать новый ресурс. Запихнуть что-то новое.
    • PUT / PATCH — чтобы обновить ресурс целиком или кусочек. Поправить.
    • DELETE — чтобы, собственно, удалить ресурс. Отправить нахуй.
  • Без состояния (Stateless): Сервер — не твоя нянька, он не будет помнить, кто ты и что ты хотел между запросами. Каждый раз, обращаясь, ты должен притащить с собой всю нужную информацию, например, токен для входа, в заголовках. Доверия ебать ноль, каждый запрос сам за себя.
  • Представление данных: Данные туда-сюда гоняются в понятных форматах. Чаще всего это JSON (сейчас это вообще пиздец как популярно), ну или XML, если ты любитель старины глубокой.

Вот, смотри, как на C++ с библиотекой cpr (это обёртка над libcurl) выглядит:

#include <cpr/cpr.h>
#include <iostream>
#include <nlohmann/json.hpp> // Для работы с JSON

using json = nlohmann::json;

int main() {
    // 1. GET-запрос для получения данных о пользователе
    cpr::Response r = cpr::Get(cpr::Url{"https://api.example.com/users/1"});
    if (r.status_code == 200) {
        auto user_data = json::parse(r.text);
        std::cout << "User name: " << user_data["name"] << std::endl;
    }

    // 2. POST-запрос для создания нового пользователя
    json new_user = {
        {"name", "Alice"},
        {"email", "alice@example.com"}
    };
    cpr::Response post_r = cpr::Post(
        cpr::Url{"https://api.example.com/users"},
        cpr::Header{{"Content-Type", "application/json"}},
        cpr::Body{new_user.dump()}
    );
    std::cout << "Create status: " << post_r.status_code << std::endl;

    return 0;
}

А почему он всех уделал? Да потому что он, блядь, простой как три копейки! Все и так знают HTTP, его везде можно прикрутить — из браузера, с телефона, с другого сервиса. Получается такой универсальный язык, язык ебать копать, на котором могут общаться любые железки и софт. Из-за этой своей универсальности он и стал стандартом де-факто, хоть ты тресни.