#graphql
Вопрос:
Я не могу понять, как GraphQL может свести к минимуму количество вызовов для получения данных с нескольких конечных точек. Например, у нас есть 2 конечные точки :
- тот, который предоставляет информацию о посте, включая идентификатор автора по идентификатору поста
socialmedia.com/posts/:postid
- другой, который предоставляет информацию об авторе поста по идентификатору пользователя
socialmedia.com/authors/:authorid
Мой вариант использования заключается в том, что я сначала получаю идентификатор автора из сведений о публикации, а затем сведения об авторе на основе идентификатора автора. Если бы я был клиентом rest, я бы сделал 2 звонка на 2 эти конечные точки.
Как это можно свести к минимуму при использовании graphql?
Комментарии:
1. Имея одну конечную точку, обычно
/graphql
, к которой вы можете сделать один запрос, который возвращает данные о публикации и авторах в соответствии с вашими потребностями.
Ответ №1:
Это действительно зависит от того, как вы настроили свою схему GraphQL. Но давайте предположим, что в вашей схеме есть два типа:
type Author {
id: ID!
name: String
posts: [Post!]
}
type Post {
id: ID!
body: String
author: Author!
}
Таким образом, у Автора много Постов, а у Поста один Автор. Для примера давайте также предположим, что у вас есть запрос верхнего уровня, который позволяет вам получить все сообщения:
query Query {
allPosts: [Post!]
}
Теперь предположим, что вы хотите загрузить все сообщения вместе с именем автора. Ваш запрос может выглядеть следующим образом:
query AllPostsWithAuthors {
allPosts {
id
body
author {
id
name
}
}
}
Сервер должен разрешить этот запрос и предоставить именно ту информацию, которую вы запросили, и все это за один раз туда и обратно.
Но опять же — это зависит от того, как вы настроили свою схему. Сам по себе GraphQL-это всего лишь спецификация, и при этом довольно простая. Я вижу, как многие люди (включая меня) борются со «сменой парадигмы», чтобы мыслить в терминах графиков, а не в терминах ресурсов и конечных точек, и в конечном итоге они разрабатывают API-интерфейсы с ребяческим мышлением, завернутые в GraphQL, и результат не очень хороший. Я настоятельно рекомендую эту статью: https://graphqlme.com/2017/11/11/build-better-graphql-apis-thinking-in-graphs/
Комментарии:
1. Спасибо. Мне следовало лучше сформулировать свой вопрос. Насколько я понимаю, серверу GraphQL придется внутренне сделать 2 вызова конечным точкам, прежде чем возвращать результат вызывающему. Я прав?
2. О, так вы используете GraphQL в качестве прокси-сервера для REST API? Если это так, то да — сервер GraphQL должен был бы принять этот удар. Но вашему клиенту нужно сделать только один вызов сервера GraphQL, так что это все равно выигрыш. И вы могли бы реализовать свой сервер GraphQL с некоторым интеллектуальным кэшированием. Например, если у вас уже есть
Author
данные в кэше, вы можете избежать перехода кsocialmedia.com/authors/:authorid
конечной точке.