Как я могу получить и использовать нужные мне свойства этого API-интерфейса GraphQL с помощью Dart? - PullRequest
0 голосов
/ 09 января 2020

Прежде чем вы начнете читать: Я просмотрел документацию по GraphQL, но мой сценарий использования так специфичен c, и мне нужны только один раз данные, и поэтому я позволяю себе обратиться к сообществу за помощью. на этом, чтобы сэкономить время и разочарование (не планируя изучать GraphQL в будущем)

Intro

Я студент CS, разрабатывающий приложение для Flutter на сторона, где мне нужна информация об имени и местонахождении каждой автобусной остановки в конкретном округе c в Норвегии. К счастью, для этого есть открытый API-интерфейс GraphQL (URL API: https://api.entur.io/stop-places/v1/graphql) . Дело в том, что я не знаю, как запрашивать API-интерфейс GraphQL, и я не хочу тратить время на его изучение, поскольку собираюсь получить данные только один раз и покончить с этим.

Вот IDE для API: https://api.entur.io/stop-places/v1/ide

И , этот является точным запросом, который я хочу выполнить, поскольку я хочу получить автобусные остановки, расположенные в округе Тронхейм:

{
  stopPlace(stopPlaceType: onstreetBus, countyReference: "Trondheim") {
    name {
      value
    }
    ... on StopPlace {
      quays {
        geometry {
          coordinates
        }
      }
    }
  }
}

Проблема с этим запросом заключается в том, что я не получаю никаких данных при передаче «Тронхейм» в countyReference (без countReReference я получаю данные, но не для Трондхейм). Я попытался использовать официальный муниципальный номер для округа, но безуспешно, и документация по API довольно скудная ... Может быть, мне придется связаться с людьми, ответственными за API, чтобы выяснить, что не должно быть проблемой.

Но теперь вернемся к реальной проблеме - как я могу сделать этот запрос, используя пакет GraphQL для Dart? Вот пакет, который я планирую использовать : (https://pub.dev/packages/graphql)

Я хочу создать объект автобусной остановки для каждой автобусной остановки, и я хочу поместить их всех в список. Вот моя модель автобусной остановки:

class BusStop with ChangeNotifier {
  final String id;
  final String name;
  final LatLng location;

  BusStop({
    this.id,
    this.name,
    this.location
  });
}

Когда речь идет об аутентификации, вот что говорится в документации:

Этот API-интерфейс открыт по лицензии NLOD, однако он необходим чтобы все потребители идентифицировали себя, используя заголовок ET-Client-Name. Entur установит строгие политики ограничения скорости на API-потребителях, которые не идентифицируют себя с заголовком и оставляют за собой право блокировать неопознанных потребителей. Структура ET-Client-Name должна быть такой: "company - application" Примеры заголовков: "brakar - tripplanner" "fosen_utvikling - boardboard" "norway_bussekspress - nwy-app"

Ссылка на Документация по API: https://developer.entur.org/pages-nsr-nsr

Было бы здорово узнать, как мне следует go об этом! Я благодарен за все ответы на этот вопрос, я знаю, что мне лень здесь изучать GraphQL, но из-за моего сценария использования я подумал, что это займет меньше времени и разочарования, если спросить здесь!

1 Ответ

1 голос
/ 09 января 2020

Правильный запрос

Прежде всего, вы, похоже, достаточно хорошо разбираетесь в GraphQL. В этом нет ничего гораздо большего, чем то, что вы делаете. Какие запросы поддерживает API, зависит от API. Проблема, которую вы, похоже, имеете, больше связана с используемым вами API c. Я мог бы найти правильный запрос для вас, и если нет, я быстро объясню, что я сделал, и, возможно, вы сможете улучшить запрос самостоятельно:

{
  stopPlace(stopPlaceType: onstreetBus, municipalityReference: "KVE:TopographicPlace:5001") {
    name {
      value
    }
    ... on StopPlace {
      quays {
        geometry {
          coordinates
        }
      }
    }
  }
}

Так что, чтобы добраться до этого, я начал узнавать больше о " Тронхейм "bei, используя запрос topographicPlace.

{
  topographicPlace(query: "Trondheim") {
    id
    name {
      value
    }
    topographicPlaceType
    parentTopographicPlace {
      id
      name {
        value
      }
    }
  }
}

Если вы сделаете это, вы увидите, что" Тронхейм "не является округом согласно API: "topographicPlaceType": "municipality". Я не знаю, что такое municipality , но это другой фильтр для этого типа в запросе, который вы предоставили. Тогда размещение «Тронхейма» не дало никаких результатов, поэтому я попробовал идентифицировать Тронхейм. Теперь это дает мне кучу результатов.

О клиенте GraphQL, который вы используете:

Это, похоже, клон "Apollo Client" в Dart. Apollo Client - это тяжелый программный продукт, который поставляется с множеством потрясающих функций при использовании в веб-приложении. Вы, вероятно, просто хотите сделать один запрос GraphQL от бэкэнда. Я бы порекомендовал использовать простой HTTP-клиент для отправки запроса POST в API GraphQL и тело JSON (не забывайте заголовок типа содержимого) со следующими свойствами: query, содержащее строку запроса сверху и variables JSON объект, отображающий имена переменных в значения (необходим, только если вы решили добавить переменные в свой запрос.

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