← Назад к вопросам

Есть ли методы запросов в GraphQL?

1.2 Junior🔥 201 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы запросов в 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

АспектRESTGraphQL
Методы запросаGET, POST, PUT, DELETE, PATCHQuery, 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 подход.

Есть ли методы запросов в GraphQL? | PrepBro