Выполнение ввода в Graphql, когда ввод может принимать разные типы - PullRequest
0 голосов
/ 02 февраля 2020

Я хочу создать мутацию apis, где ввод может быть разных типов, что-то вроде интерфейса, который у нас есть в типах. Я знаю, что у нас не может быть интерфейса в типах ввода, я хочу знать, как мы можем поддерживать несколько типов ввода в одном входе. Чтобы объяснить проблему, я использую фиктивный пример:

input CreateCatInput{
  id: String
  name: String
}

input CreateDogInput{
  id: String
  name: String
  breed: String
}

input CreateElephantInput{
  id: String
  name: String
  weight: String
}

Теперь, если мы хотим написать apis для него, мне придется написать api для каждого типа

createCat(input: CreateCatInput!)
createDog(input: CreateDogInput!)
createElephant(input: CreateElephantInput!)

Проблема, с которой я сталкиваюсь при таком подходе:

  1. Мне придется написать много apis, предположим, что если я поддерживаю 20 типов животных, мне придется написать 20 create apis. Но мне не нравятся эти много apis для пользователей, я хочу, чтобы пользователь видел очень мало apis.
  2. Предположим, мы поддерживаем 20 типов животных, как пользователь узнает, какие все животные поддерживаются, они мне нужно будет увидеть все API, которые мы поддерживаем, в проводнике API.

Решение, которое я ищу, состоит в том, что у меня есть только один API:

  createAnimal(input: CreateAnimalInput!)

Поскольку поддержка интерфейса в настоящее время не существует, как компании реализуют входные данные, которые могут быть нескольких типов? Как я могу определить входные данные так, чтобы я мог дать только один вход в API?

Я прочитал это предложение , но оно включает определение аннотаций, в настоящее время я пробую это. Я хочу посмотреть, как другие люди решают эту проблему.

1 Ответ

2 голосов
/ 03 февраля 2020

Тип входного объединения может решить вашу проблему, но, к сожалению, сейчас он не поддерживается. Тем не менее, хорошая новость заключается в том, что для этой функции уже есть RF C, что означает, что она может быть включена в следующий выпуск спецификации GraphQL.

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

input CreateAnimalInput{
  id:   String
  name: String
  animalType :AnimalType!
  dogParam   : CreateDogInput
  elephantParam : CreateElephantInput
}

enum AnimalType{
  DOG
  ELEPHANT
}

input CreateDogInput{
  breed: String
}

input CreateElephantInput{
  weight: String
}

createAnimal(input: CreateAnimalInput!)

Если для animalType установлено значение DOG, будут учитываться только значения в поле dogParam, а другие поля параметров животных будут игнорироваться.

...