The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Facebook представил новый язык формирования запросов GraphQL

15.09.2015 11:24

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

Для загрузки доступен черновик спецификации GraphQL, эталонная реализация на языке JavaScript, библиотека с парсером для C/C++, серверные обвязки для различных языков программирования (Go, Ruby, Scala, Java, .Net, Python) и набор сопутствующих инструментов, в том числе работающая в браузере интегрированная среда для формирования запросов graphiql и серверные компоненты для swapi и express. Код открыт под лицензией BSD.

Последние несколько лет GraphQL активно используется в Facebook и служит основой для абстрагирования потоков данных в мобильных приложениях для Android и iOS. GraphQL позволил уйти от практики разработки мобильных приложений в виде надстройки над вариантом сайта Facebook для мобильных устройств в сторону самодостаточных программ с логикой выполнения на стороне клиента. При реализации парадигмы Model-View для получения данных отлично подходит формат JSON, но существующие методы для отправки запросов, такие, как REST и ad hoc, не отвечали требованиям Facebook и требовали выноса части логики на сторону сервера, не обладая должной универсальностью. Facebook попытался решить эту проблему в GraphQL и за последние три года перевёл все свои мобильные приложение на данную технологию.

В GraphQL состав результата запроса диктуется клиентом и содержит только необходимый набор данных - лишь то, что запросил клиент и ничего лишнего. Запрос оформляется в форме иерархического набора полей, а ответ приходит в отзеркаленном формате JSON с заполнением полей необходимыми данными. Корректность запроса обеспечивается через встроенную систему проверки типов.

Особенности GraphQL:

  • Явное задание формы данных - ответ отзеркаливает поля, указанные в запросе, что позволяет точно знать какие именно данные будут получены и какого они будут типа;
  • Иерархическая организация, позволяющая отследить взаимосвязь между объектами без необходимости отправки повторных запросов и формирования сложных условий слияния (в отличие от RESTful-систем и SQL). Иерархия данных задаётся с использованием структуры в форме графа и отлично сочетается с потребностями, возникающими при построении интерфейсов пользователя;
  • Жесткая типизация - каждый уровень запроса GraphQL связывается с определённым типом и для каждого поля декларируется свой тип (по аналогии с SQL) Такой подход позволяет выявить ошибки на этапе до выполнения запроса и даёт возможность повысить качество клиентских программ;
  • GraphQL является лишь протоколом, не налагающим каких-либо требований к характеру хранилища. На сервере за каждое поле GraphQL отвечает определённая функция, что позволяет легко адаптировать взаимодействие с клиентами по GraphQL в имеющиеся кодовые базы, без изменения существующих схем хранения и бизнес-логики;
  • Возможность получения сведений о поддерживаемых сервером данных. У сервера GraphQL можно запросить список поддерживаемых типов и получить более полные сведения о возможностях предоставляемого сервером API, без необходимости изучения кода и спецификаций;
  • Независимость от версии серверного API - так как форма возвращаемых данных задаётся клиентом, серверное API может расширяться без опасности нарушения совместимости с клиентским ПО. Например, на сервере могут быть реализованы обработчики новых полей, которые будут применяться только для версий клиентов, поддерживающих эти поля, а для старых клиентов будут игнорироваться.

Пример типов:


   enum Episode { NEWHOPE, EMPIRE, JEDI }

   interface Character {
     id: String
     name: String
     friends: [Character]
     appearsIn: [Episode]
   }

   type Human : Character {
     id: String
     name: String
     friends: [Character]
     appearsIn: [Episode]
     homePlanet: String
   }

Пример запросов:


   query HeroNameQuery {
     hero {
       name
     }
   }

   query HeroNameAndFriendsQuery {
     hero {
       id
       name
       friends {
         id
         name
       }
     }
   }



  1. Главная ссылка к новости (https://code.facebook.com/post...)
  2. OpenNews: Facebook представил фреймворк React Native и среду разработки Nuclide
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/42964-facebook
Ключевые слова: facebook, graphql
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (21) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Вадик (??), 11:30, 15/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Штука вроде годная, особенно с зеркалированием
     
  • 1.2, Аноним (-), 11:34, 15/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Давно такое искал, а то с RESTful черт ногу сломит.
     
     
  • 2.7, Аноним (-), 13:06, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    RESTful видимо намекает на UNREST :)
     

  • 1.3, Аноним (-), 11:34, 15/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    непонятно, как реализовывать поддержку таких запросов на бэкенде
     
     
  • 2.4, Аноним (-), 11:45, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Видимо примерно так https://github.com/graphql/libgraphqlparser/blob/master/python/example.py
     
     
  • 3.5, анон (?), 11:56, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Что в слове бэкенд тебе было не понятно, что ты эту ссылку сюда впендюрил?
     
     
  • 4.10, Аноним (-), 14:48, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Все он правильно сделал (только непонятно почему только на питон, хотя доступны и другие языки).
    Если вы не знаете определение слова парсер, то про бэкенд не стоит даже заикаться.
     
     
  • 5.12, анон (?), 15:19, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    И как парсер позволит исполнить запрос? Не разобрать, а исполнить?
     
     
  • 6.21, MPEG LA (ok), 20:25, 16/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    GraphQL - язык, а не БД, барашко. над чем ты собрался выполнять запрос?
     

  • 1.8, жабабыдлокодер (ok), 13:06, 15/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –8 +/
    XML был бы удобней: API можно описать схемой, по которой в клиенте легко разобрать и реализовать структуру данных.
     
     
  • 2.9, Owlet (?), 14:22, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Угу, и каждый клиент разберёт по-своему, несовместимо с остальными..
     
     
  • 3.13, Аноним (-), 15:22, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Схема вещь однозначная
     
  • 2.16, ... (?), 16:30, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    JSON vs XML уже давно было. JSON победил.
     
  • 2.17, Адепт (?), 17:08, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Идеальный ник для этого комментария
     

  • 1.11, Аноним (-), 15:04, 15/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я невнимательно читал или оно не может в join'ы?
     
     
  • 2.15, ... (?), 16:13, 15/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Объединять нужно таблицы. А у них скорее документы.
    Посмотри на картинку в новости. C объединениями это выглядело-бы как то так:
    "select user.id, user.name, <...> profilePicture.uri, <...>
    from user, profilePicture <...>
    where profilePicture.id = user.profilePictureId <...> "
    Им это все не нужно.
     
  • 2.18, Аноним (-), 07:21, 16/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    вторая картинка, поле friends
     
     
  • 3.19, Аноним (-), 09:35, 16/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    первая картинка, поле friends
     

  • 1.20, Аноним (-), 11:09, 16/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Mongo изобрели?
     
  • 1.22, Аноним (-), 22:50, 16/09/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пусть стандартизируют, а то без стандарта это очередной велосипед
     
  • 1.24, Аноним (24), 14:26, 07/04/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    на медиуме есть годные статьи на РУ
    https://medium.com/marcius-corp/tutorial-graphql-subscriptions-ru-3e75153441e4
    https://medium.com/marcius-corp/tutorial-graphql-server-with-koa2-and-mongodb-
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру