Как адаптировать запрос к API? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь обернуть голову вокруг GraphQL.

Сейчас я просто играю с publi c API Artsy (художественный сайт, детская площадка на https://metaphysics-production.artsy.net). Я хочу добиться следующего:

  1. Я хочу получить все типы узлов entities, не объявляя их вручную (есть ли для этого ярлык)?
  2. Я хочу каждый узел с полем type, с которого я могу прочитать тип, без разбора через imageUrl et c. чтобы придумать это.

То, что я построил на данный момент, таково:

{
  search(query: "Berlin", first: 100, page: 1, entities: [ARTIST, ARTWORK, ARTICLE]) {
  edges {
    node {
      displayLabel
      imageUrl
      href
    }
  }
}}

Я думаю, очень примитивно. Ребята, вы можете мне помочь?

1 Ответ

3 голосов
/ 24 января 2020

TL; DR :

1) Нет ярлыка, это не то, что GraphQL предлагает из коробки. И это не то, что я смог найти через их схему.

2) Возвращенные node типа Searchable не содержат свойства для type, которое вы ищете. Но вы можете получить к нему доступ через синтаксис ... on SearchableItem (объединение) .


Пояснение :

Для вопроса 1):

Глядя на их схему, вы видите, что их поисковый запрос имеет следующие данные типа:

search(
  query: String!
  entities: [SearchEntity]
  mode: SearchMode
  aggregations: [SearchAggregation]
  page: Int
  after: String
  first: Int
  before: String
  last: Int
): SearchableConnection

Запрос принимает свойство entities типа SearchEntity, которое выглядит следующим образом:

enum SearchEntity {
  ARTIST
  ARTWORK
  ARTICLE
  CITY
  COLLECTION
  FAIR
  FEATURE
  GALLERY
  GENE
  INSTITUTION
  PROFILE
  SALE
  SHOW
  TAG
}

В зависимости от вашего варианта использования, если вы строите этот запрос с помощью некоторого кода, вы можете узнать, какие значения SearchEntity они имеют:

{
  __type(name: "SearchEntity") {
    name
    enumValues {
      name
    }
  }
} 

Какие возвращает:

{
  "data": {
    "__type": {
      "name": "SearchEntity",
      "enumValues": [
        {
          "name": "ARTIST"
        },
        {
          "name": "ARTWORK"
        },

      ...

    }
  }
}

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

Что-то вроде этого:

query search($entities: [SearchEntity]) {
  search(query: "Berlin", first: 100, page: 1, entities: $entities) {
    edges {
    node {
      displayLabel
      imageUrl
      href
    }
  }
 }
}

и в разделе переменных вашего запроса вам просто нужно добавить:

{
  "entities": [ARTIST, ARTWORK, ...]
}

Что касается вопроса 2)

Сам запрос возвращает объект SearchableConnection.

type SearchableConnection {
  pageInfo: PageInfo!
  edges: [SearchableEdge]
  pageCursors: PageCursors
  totalCount: Int
  aggregations: [SearchAggregationResults]
}

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

type SearchableEdge {
  node: Searchable
  cursor: String!
}

и, наконец, node типа Searchable, который содержит данные, к которым вы пытаетесь получить доступ.

Теперь тип Searchable не содержит type:

type Searchable {
  displayLabel: String
  imageUrl: String
  href: String
}

Но, если вы посмотрите, где реализован этот тип Searchable, вы можете увидеть SearchableItem - который содержит свойство displayType - которого на самом деле нет в Searchable.

Вы можете получить доступ к свойству из SearchableItem и получите displayType, вот так:

{
  search(query: "Berlin", first: 100, page: 1, entities: [ARTIST, ARTWORK, ARTICLE]) {
    edges {
      node {
        displayLabel
        imageUrl
        href
        ... on SearchableItem {
          displayType
        }
      }
    }
  }
}

и ваш результат будет выглядеть так:

{
  "data": {
    "search": {
      "edges": [
        {
          "node": {
            "displayLabel": "Boris Berlin",
            "imageUrl": "https://d32dm0rphc51dk.cloudfront.net/CRxSPNyhHKDIonwLKIVmIA/square.jpg",
            "href": "/artist/boris-berlin",
            "displayType": "Artist"
          }
        },

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