Что такое API и какова его роль в бэкенде?

Ответ

API (Application Programming Interface) — это программный интерфейс, который определяет, как различные программные компоненты должны взаимодействовать друг с другом. В контексте бэкенда API выступает в роли «контракта», который сервер предоставляет клиентам (например, веб-браузерам, мобильным приложениям или другим серверам).

Этот контракт описывает:

  • Какие запросы можно отправлять на сервер.
  • Какой формат должны иметь эти запросы (эндпоинты, методы, параметры).
  • Какой формат будет иметь ответ от сервера (например, JSON с определенной структурой).

Ключевые принципы и роли API:

  • Абстракция: Клиенту не нужно знать, как реализована логика на сервере (на каком языке он написан, какую базу данных использует). Он просто отправляет запрос по правилам API и получает ответ.
  • Стандартизация: API часто следуют общепринятым стандартам (REST, GraphQL, gRPC), что упрощает их интеграцию и использование.
  • Независимость: Сервер и клиент могут разрабатываться, тестироваться и развертываться независимо друг от друга, пока они оба соблюдают «контракт» API.

Простой пример веб-API на Go с использованием net/http:

Этот код создает HTTP-сервер с одной конечной точкой (endpoint) /api/greeting, которая возвращает JSON-ответ.

package main

import (
    "encoding/json"
    "log"
    "net/http"
)

// Структура для нашего ответа
type GreetingResponse struct {
    Message string `json:"message"`
}

// Обработчик HTTP-запросов
func greetingHandler(w http.ResponseWriter, r *http.Request) {
    // Устанавливаем заголовок, сообщая клиенту, что мы отправляем JSON
    w.Header().Set("Content-Type", "application/json")

    // Создаем ответ
    response := GreetingResponse{Message: "Hello from Go backend!"}

    // Кодируем ответ в JSON и отправляем его клиенту
    err := json.NewEncoder(w).Encode(response)
    if err != nil {
        log.Printf("Error encoding JSON: %v", err)
    }
}

func main() {
    // Регистрируем наш обработчик для пути /api/greeting
    http.HandleFunc("/api/greeting", greetingHandler)

    log.Println("Starting server on :8080")
    // Запускаем сервер на порту 8080
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatalf("Could not start server: %sn", err)
    }
}