HTTP / API

Шпаргалка по HTTP headers, методам, REST, GraphQL, WebSocket/SSE

📋 HTTP Headers

CORS

Header Пример Описание
Access-Control-Allow-Origin * или https://example.com Разрешенные источники
Access-Control-Allow-Methods GET, POST, PUT, DELETE Разрешенные методы
Access-Control-Allow-Headers Content-Type, Authorization Разрешенные заголовки
Access-Control-Allow-Credentials true Разрешить cookies

Cache

Header Пример Описание
Cache-Control max-age=3600, public Политика кэширования
ETag "abc123" Тег версии ресурса
Last-Modified Wed, 21 Oct 2015 07:28:00 GMT Дата последнего изменения

Security Headers

Header Пример Описание
X-Frame-Options DENY или SAMEORIGIN Защита от clickjacking
X-Content-Type-Options nosniff Отключить MIME sniffing
Content-Security-Policy default-src 'self' Политика безопасности контента

Content Negotiation

Header Пример Описание
Accept application/json Предпочитаемый формат ответа
Accept-Language en-US, en;q=0.9 Предпочитаемый язык
Content-Type application/json; charset=utf-8 Тип контента запроса

🔄 HTTP Методы

Метод Safe Idempotent Описание
GET Получить ресурс
POST Создать ресурс
PUT Заменить ресурс полностью
PATCH Частичное обновление
DELETE Удалить ресурс

🎯 REST Best Practices

Пагинация

GET /api/users?page=1&limit=20
GET /api/users?offset=0&limit=20
GET /api/users?cursor=abc123&limit=20

Response:
{
  "data": [...],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 100,
    "hasNext": true
  }
}

Фильтры и сортировка

GET /api/users?status=active&role=admin
GET /api/users?sort=name&order=asc
GET /api/users?filter[age][gte]=18&filter[age][lte]=65

Версионирование

GET /api/v1/users
GET /api/v2/users

Или через header:
Accept: application/vnd.api+json;version=2

Обработка ошибок

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid input",
    "details": [
      {
        "field": "email",
        "message": "Invalid email format"
      }
    ]
  }
}

🔷 GraphQL

Queries

query {
  user(id: "123") {
    name
    email
    posts {
      title
      createdAt
    }
  }
}

Fragments

fragment UserFields on User {
  id
  name
  email
}

query {
  user(id: "123") {
    ...UserFields
  }
}

Variables

query GetUser($id: ID!) {
  user(id: $id) {
    name
  }
}

Variables:
{
  "id": "123"
}

Pagination (Cursor-based)

query {
  posts(first: 10, after: "cursor123") {
    edges {
      node {
        id
        title
      }
      cursor
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

🔌 WebSocket / SSE

Когда использовать

Технология Когда использовать
WebSocket Двусторонняя связь, чаты, игры, real-time обновления
SSE Односторонняя связь (сервер → клиент), уведомления, ленты

WebSocket коды

Код Описание
1000 Нормальное закрытие
1001 Сервер уходит
1006 Аномальное закрытие

Примеры

// WebSocket
const ws = new WebSocket('wss://api.example.com');
ws.onmessage = (event) => {
  console.log(event.data);
};
ws.send(JSON.stringify({ type: 'ping' }));

// SSE
const eventSource = new EventSource('/api/events');
eventSource.onmessage = (event) => {
  console.log(event.data);
};