В чем смысл именования запросов и мутаций в GraphQL?

Простите за наивный вопрос, но я искал ответ повсюду, и все, что я нашел, является либо расплывчатым, либо бессмысленным для меня. Возьмите этот пример из спецификации GraphQL:

query getZuckProfile($devicePicSize: Int) {
  user(id: 4) {
    id
    name
    profilePic(size: $devicePicSize)
  }
}

Какой смысл называть этот запрос getZuckProfile? Я видел кое-что о документах GraphQL, содержащих несколько операций. Влияет ли запрос именования на возвращаемые данные как-то? Я бы сам это проверил, но у меня нет сервера и набора данных, с которыми я бы мог легко поэкспериментировать. Но было бы хорошо, если бы что-то в каком-то документе могло бы прояснить это - пока что все примеры - это супер простые одиночные запросы, или запросы, которые названы, но не объясняют, почему они (кроме "здесь крутой") что вы можете сделать. ") Какие преимущества я получаю от именования запросов, которых у меня нет, когда я отправляю один анонимный запрос на запрос?

Также, что касается мутаций, я вижу в спецификации:

mutation setName {
  setName(name: "Zuck") {
    newName
  }
}

В этом случае вы указываете setName дважды. Почему? Я понял, что одним из них является имя поля мутации, и оно необходимо для сопоставления его с внутренней схемой, но почему бы и нет:

mutation {
  setName(name: "Zuck") {
...

Какую выгоду я получу, указав одно и то же имя дважды? Я понимаю, что первое, скорее всего, произвольно, но почему это не шум? Мне должно быть не хватает чего-то очевидного, но ничто из того, что я нашел до сих пор, не прояснило это для меня.

Ответ 1

Имя запроса не имеет никакого значения на сервере. Он используется только для клиентов, чтобы идентифицировать ответы (поскольку вы можете отправить несколько запросов/мутаций в одном запросе).

Фактически, вы можете отправить только анонимный объект запроса, если это единственное в запросе GraphQL (и не имеет никаких параметров):

{
  user(id: 4) {
    id
    name
    profilePic(size: 200)
  }
}

Это работает только для запроса, а не для мутации.

Однако, если вы используете ключевое слово query (или mutation), вам необходимо указать имя. Сервер теоретически может обрабатывать запрос даже без имени, но это не то, что позволяет текущая спецификация GraphQL.

EDIT

Как отмечает @orta ниже, имя также может использоваться сервером для идентификации постоянного запроса. Однако это не часть спецификации GraphQL, это просто пользовательская реализация сверху.

Ответ 2

Мы используем именованные запросы, чтобы их можно было постоянно отслеживать, и чтобы мы могли делать постоянное хранение запроса. Существует дублирование для переменных запроса, чтобы заполнить пробелы.

Как пример:

query getArtwork($id: String!) {
  artwork(id: $id) {
    title
  }
}

Вы можете запустить его с Artsy GraphQL API здесь

Преимущество состоит в том, что каждый раз один и тот же запрос, а не другая строка, потому что переменные запроса - это бит, который отличается. Это означает, что вы можете создавать инструменты поверх этих запросов, потому что вы можете рассматривать их как неизменяемые.