Есть ли методы запросов в GraphQL?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы запросов в GraphQL
Нет, в GraphQL нет методов запросов в традиционном смысле REST API. Вместо этого используются типы операций, которые определяют, что делает запрос. Это фундаментальное отличие от REST API.
REST vs GraphQL подход
REST API использует HTTP методы:
// REST API
GET /api/users/1 // Получить пользователя
POST /api/users // Создать пользователя
PUT /api/users/1 // Обновить пользователя
DELETE /api/users/1 // Удалить пользователя
PATCH /api/users/1 // Частично обновить
GraphQL использует типы операций:
// GraphQL
query { ... } // Получить данные (чтение)
mutation { ... } // Изменить данные (запись)
subscription { ... } // Подписаться на обновления (streaming)
Три типа операций GraphQL
1. Query (Запрос на чтение)
Операция для получения данных. Это безопасная операция чтения.
// GraphQL Query
query GetUser {
user(id: "123") {
id
name
email
posts {
id
title
}
}
}
// Отправляется как POST запрос, но это операция Query
fetch('https://api.example.com/graphql', {
method: 'POST', // GraphQL всегда использует POST
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: `
query GetUser {
user(id: "123") {
id
name
email
}
}
`
})
});
2. Mutation (Мутация — изменение данных)
Операция для создания, обновления или удаления данных.
// GraphQL Mutation
mutation CreateUser {
createUser(input: {
name: "Алиса"
email: "alice@example.com"
}) {
id
name
email
}
}
// Отправляется как POST
fetch('https://api.example.com/graphql', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: `
mutation CreateUser {
createUser(input: {
name: "Алиса"
email: "alice@example.com"
}) {
id
name
email
}
}
`
})
});
3. Subscription (Подписка на обновления)
Операция для получения real-time обновлений через WebSocket.
// GraphQL Subscription
subscription OnUserCreated {
userCreated {
id
name
email
}
}
// Обычно использует WebSocket
import { createClient } from 'graphql-ws';
const client = createClient({
url: 'wss://api.example.com/graphql'
});
client.subscribe(
{
query: `
subscription OnUserCreated {
userCreated {
id
name
}
}
`
},
{
next: (data) => console.log('New user:', data),
error: (err) => console.error(err),
complete: () => console.log('Done')
}
);
HTTP методы в GraphQL
Хотя GraphQL не имеет методов запросов, он всё равно использует HTTP методы, но по-другому:
// GET для простых query
// Можно отправить query как GET запрос с параметром
GET /graphql?query={user(id:"123"){id name}}
// POST для всех операций (рекомендуется)
// Все query, mutation, subscription отправляются как POST
POST /graphql
Body: { query, variables, operationName }
Практический пример
// Создание клиента для GraphQL
import { ApolloClient, gql, InMemoryCache } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.example.com/graphql',
cache: new InMemoryCache()
});
// Query
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
client.query({
query: GET_USER,
variables: { id: '123' }
}).then(result => {
console.log('User:', result.data.user);
});
// Mutation
const CREATE_USER = gql`
mutation CreateUser($input: CreateUserInput!) {
createUser(input: $input) {
id
name
email
}
}
`;
client.mutate({
mutation: CREATE_USER,
variables: {
input: {
name: 'Боб',
email: 'bob@example.com'
}
}
}).then(result => {
console.log('Created user:', result.data.createUser);
});
Структура GraphQL запроса
Все GraphQL запросы имеют одинаковую структуру:
{
query: `
operation OperationName($var: Type) {
field(argument: value) {
subfield
}
}
`,
variables: {
var: "value"
},
operationName: "OperationName" // Опционально, для множественных операций
}
Идемпотентность
Важный момент:
// Query ВСЕГДА идемпотентны (безопасны, не меняют состояние)
// Можно отправлять сколько угодно раз без побочных эффектов
query { users { id name } }
// Mutation НЕ идемпотентны (меняют состояние)
// Каждое выполнение может иметь побочные эффекты
mutation { createUser(input: {...}) { id } }
Сравнение с REST
| Аспект | REST | GraphQL |
|---|---|---|
| Методы запроса | GET, POST, PUT, DELETE, PATCH | Query, Mutation, Subscription |
| HTTP метод | Разные методы | Обычно только POST |
| Идемпотентность | Определяется методом | Определяется типом операции |
| Кэширование | Встроено в HTTP | Нужно настраивать отдельно |
| Безопасность | GET безопасен, DELETE опасен | Зависит от операции |
Лучшие практики
// ✅ Правильно: Query для чтения
query {
user(id: "123") {
id
name
}
}
// ✅ Правильно: Mutation для изменений
mutation {
updateUser(id: "123", input: { name: "Alice" }) {
id
name
}
}
// ❌ Неправильно: Mutation для чтения
mutation {
getUser(id: "123") {
id
}
}
// ❌ Неправильно: Query для изменения
query {
createUser(input: { name: "Alice" }) {
id
}
}
Итог
В GraphQL нет методов запросов в стиле REST:
- Вместо GET/POST/PUT/DELETE используются Query/Mutation/Subscription
- Все операции обычно отправляются как POST HTTP запросы
- Query — для чтения (идемпотентна)
- Mutation — для создания/обновления/удаления (не идемпотентна)
- Subscription — для real-time обновлений (WebSocket)
Это более точное разделение операций по их семантике, чем REST подход.