Мы внедряем сервис GraphQL, который стоит перед несколькими внутренними микросервисами.
Например, у нас есть Product
, и у каждого продукта есть список заказов в истории. Наш внутренний сервер предоставляет два REST API, один для данных о продукте, а другой возвращает список заказов в истории продукта.
В нашем клиентском приложении есть две страницы: одна - это страница с подробностями о продукте, другая - это история заказа продукта.
Таким образом, на странице сведений о продукте мы можем получить только подробные данные о продукте, в то время как на странице со списком заказов нам нужны только данные списка.
Схема GraphQL, как показано ниже:
type ProductOrder {
createAt: Date!
userName: String!
count: Int
}
type Product {
productId: ID
name: String
orders: [ProductOrder!]!
}
Query {
product(productId: ID): Product
}
и резолверы такие
const resolvers = {
Query: {
product(_, { productId}){
// fetch detail data from backend API
return await someService.getProductDetail(productId);
}
},
Product: {
orders(product){
// fetch order list from another API
return await someService.getProductOrders(product.productId);
}
}
};
Но мы обнаруживаем потенциальный избыточный запрос, используя приведенный выше код.
Когда мы запрашиваем данные списка заказов со страницы списка заказов, мы должны сначала запросить API сведений о продукте, а затем мы можем запросить API списка заказов. Но нам ТОЛЬКО нужны данные списка заказов, а не данные о продукте вообще. В этом случае мы считаем, что запрос сведений о продукте бесполезен, как мы можем устранить этот запрос?
Было бы лучше, если бы мы могли отправить только один запрос для получения данных списка заказов.