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);
};