Как запросить сервер Apollo GraphQL с определенным контекстом? - PullRequest
0 голосов
/ 01 марта 2019

Я пишу API Apollo GraphQL, который возвращает информацию о продуктах различных брендов.Упрощенная версия схемы выглядит следующим образом:

type Query {
  products: [Product]!
}

type Product {
  name: String!
  brand: String!
}

Я хочу иметь возможность запрашивать продукты определенного бренда.Обычно этого было бы легко достичь, добавив аргумент brand к объекту Product:

type Query {
    products(brand: String!): [Product]!
}

Однако у меня есть несколько клиентов GraphQL в разных приложениях, и каждый связан с определенной маркой, поэтомукажется избыточным, чтобы всегда передавать один и тот же аргумент brand в каждом запросе.У меня также есть много других объектов в моей схеме (заказы, транзакции и т. Д.), Которые специфичны для бренда и требуют аргумента brand.

Кроме того, мои средства распознавания должны запрашивать другой API в зависимости отбренд, поэтому даже объекты в моей схеме, такие как User, которые концептуально не связаны с брендом, потенциально могут нуждаться в аргументе brand, чтобы распознаватель знал, из какого API следует выбирать.

Есть лиспособ установить контекст бренда для каждого клиента и получить этот контекст на сервере?Или, может быть, есть лучший способ добиться разделения бренда?

1 Ответ

0 голосов
/ 01 марта 2019

Я бы, вероятно, сделал бы Brand типом первого класса в вашем запросе GraphQL.Это не избавляет вас от необходимости отвечать на многие вопросы, которые вы описываете для конкретного бренда, но, по крайней мере, дает вам общее начало для начала.Тогда вы получите API, похожий на:

type Query {
  brand(name: String!): Brand
  allProducts: [Product!]!
}
type Brand {
  name: String!
  products: [Product!]!
  # users: [User!]!
}
type Product {
  name: String!
  brand: Brand! # typical, but not important to your question
}

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

При описании приложения можно также использовать одну копию сервиса для каждого бренда,каждый с другой конечной точкой GraphQL.Это позволило бы вам напрямую параметризовать внутреннюю конфигурацию объекта для каждого бренда и сделать «текущий бренд» глобальным контекстом процесса.Здесь существуют серьезные ограничения: на уровне GraphQL объекты одного бренда никогда не могут ссылаться на другие, и если у вас много брендов, вам нужен хороший способ запуска большого количества серверов.

...