Согласно официальному сайту:
Язык запросов для вашего API Язык запросов для API
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.
GraphQL — это и язык запросов для API, и среда выполнения, которая удовлетворяет вашим запросам данных. GraphQL предоставляет полное и простое для понимания описание данных в вашем API, позволяя клиентам получать именно те данные, которые им нужны, без какой-либо избыточности, упрощая развитие API с течением времени, и может использоваться для создания мощных инструментов разработчика. .
В основном имеют следующие характеристики:
- Запросите столько данных, сколько хотите. Сделайте запрос GraphQL к своему API и получите именно те данные, которые вам нужны, ни больше, ни меньше. Запросы GraphQL всегда возвращают предсказуемые результаты.
- Получайте несколько ресурсов одним запросом. Запросы GraphQL могут не только получать свойства ресурсов, но и выполнять дальнейшие запросы по ссылкам между ресурсами. В то время как обычному REST API требуется несколько URL-адресов для запроса нескольких ресурсов, GraphQL может получить все данные, необходимые вашему приложению, в одном запросе. Это позволяет приложениям, использующим GraphQL, работать достаточно быстро даже при медленном мобильном соединении.
- Опишите все возможные системы типов. API-интерфейсы GraphQL организованы на основе типов и полей, а не конечных точек входа. Вы получаете все возможности работы с данными через единую конечную точку входа. GraphQL использует типы, чтобы гарантировать, что приложения запрашивают только возможные данные, а также предоставляет четкие вспомогательные сообщения об ошибках. Приложения могут использовать типы без написания кода для разбора вручную.
- Эволюция API не требует разделения версий. GraphQL API для добавления в ваше поле и ввода, не затрагивая существующий запрос. Старые заброшенные поля можно скрыть от инструмента. Используя единую версию эволюции GraphQL API, чтобы приложения всегда могли использовать новые функции, а также поощрять использование более компактного и лучшего обслуживания кода на стороне сервера.
- Используйте существующие данные и код. GraphQL позволяет всему вашему приложению совместно использовать набор API, не ограничиваясь конкретным механизмом хранения. Механизмы GraphQL уже реализованы на нескольких языках, что позволяет лучше использовать существующие данные и код с помощью GraphQL API. Вы просто пишете функции для полей системы типов, а GraphQL может вызывать их оптимизированным для параллелизма способом.
Demo
Сначала напишите демонстрацию, чтобы увидеть, как использовать GraphQL с Laravel.
Представляем rebing/graphql-laravel
composer require "rebing/graphql-laravel"
Начиная с Laravel 5.5, есть «автоматическое обнаружение пакетов».Tickets.WeChat.QQ.com/Yes/AD05BI K JP…функция, поэтому Laravel 5.5 не может вручную ввести провайдера и псевдоним. В предыдущей версии необходимо ввести соответствующий провайдер и псевдоним.
"extra": {
"laravel": {
"providers": [
"Rebing\\GraphQL\\GraphQLServiceProvider"
],
"aliases": {
"GraphQL": "Rebing\\GraphQL\\Support\\Facades\\GraphQL"
}
}
}
Создать тип и запрос
Тип: с помощью Типа мы можем помочь нам отформатировать тип результатов запроса, в основном логический, строковый, с плавающей точкой, целое число и т. д., а также мы можем настроить тип
Запрос: с помощью запроса мы можем получить нужные нам данные.
Создайте файл GraphQL в корневом каталоге проекта для хранения типов и запросов.
Определить тип пользователя:
<?php
/**
* User: yemeishu
*/
namespace App\GraphQL\Type;
use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;
class UsersType extends GraphQLType
{
protected $attributes = [
'name' => 'Users',
'description' => 'A type',
'model' => User::class, // define model for users type
];
// define field of type
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => 'The id of the user'
],
'email' => [
'type' => Type::string(),
'description' => 'The email of user'
],
'name' => [
'type' => Type::string(),
'description' => 'The name of the user'
]
];
}
protected function resolveEmailField($root, $args)
{
return strtolower($root->email);
}
}
Определить запрос:
<?php
/**
* User: yemeishu
*/
namespace App\GraphQL\Query;
use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Query;
use Rebing\GraphQL\Support\SelectFields;
class UsersQuery extends Query
{
protected $attributes = [
'name' => 'users',
'description' => 'A query of users'
];
public function type() {
return Type::listOf(GraphQL::type('users'));
}
// arguments to filter query
public function args()
{
return [
'id' => [
'name' => 'id',
'type' => Type::int()
],
'email' => [
'name' => 'email',
'type' => Type::string()
]
];
}
public function resolve($root, $args, SelectFields $fields)
{
$where = function ($query) use ($args) {
if (isset($args['id'])) {
$query->where('id',$args['id']);
}
if (isset($args['email'])) {
$query->where('email',$args['email']);
}
};
$users = User::with(array_keys($fields->getRelations()))
->where($where)
->select($fields->getSelect())
->get();
return $users;
}
}
Настроить graphql.php.
Зарегистрируйте написанные UsersType и UsersQuery в файле конфигурации GraphGL.
контрольная работа
У нас есть два основных подхода к тестированию, первый — использовать Postman так же, как тестирование интерфейса RESTful:
Другой способ — использовать GraphiQL:
An in-browser IDE for exploring GraphQL. https://github.com/graphql/graphiql
Здесь мы используемnoh4ck/graphiql
// 1. 安装插件
composer require "noh4ck/graphiql:@dev"
// 2. 加入 provider
Graphiql\GraphiqlServiceProvider::class
// 3. 命令
artisan graphiql:publish
Файл конфигурации показывает, что маршрут:/graphql-ui
результат операции:
Вы также можете передать параметры (id: 1) для фильтрации данных:
Mutation
Благодаря демонстрации у нас есть предварительное представление о методе запроса Query в GraphQL, а затем давайте посмотрим на использование Mutation.
Если Query является «проверкой» RESTful, то роль Mutation заключается в «добавлении, удалении и изменении».
Создайте папку «Мутация» в папке GraphQL для хранения классов, связанных с мутацией.
Create Mutation Class
<?php
/**
* User: yemeishu
* Date: 2018/4/3
*/
namespace App\GraphQL\Mutation;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Mutation;
use App\User;
class NewUserMutation extends Mutation
{
protected $attributes = [
'name' => 'NewUser'
];
public function type()
{
return GraphQL::type('users');
}
public function args()
{
return [
'name' => [
'name' => 'name',
'type' => Type::nonNull(Type::string())
],
'email' => [
'name' => 'email',
'type' => Type::nonNull(Type::string())
],
'password' => [
'name' => 'password',
'type' => Type::nonNull(Type::string())
]
];
}
public function resolve($root, $args) {
$args['password'] = bcrypt($args['password']);
$user = User::create($args);
if (!$user) {
return null;
}
return $user;
}
}
Update Mutation Class
<?php
/**
* User: yemeishu
* Date: 2018/4/3
*/
namespace App\GraphQL\Mutation;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Mutation;
use App\User;
class UpdateUserMutation extends Mutation
{
protected $attributes = [
'name' => 'UpdateUser'
];
public function type() {
return GraphQL::type('users');
}
public function args() {
return [
'id' => [
'name' => 'id',
'type' => Type::nonNull(Type::int())
],
'name' => [
'name' => 'name',
'type' => Type::nonNull(Type::string())
]
];
}
public function resolve($root, $args) {
$user = User::find($args['id']);
if (!$user) {
return null;
}
$user->name = $args['name'];
$user->save();
return $user;
}
}
Настроить graphql.php
Добавьте NewUserMutation и UpdateUserMutation в конфигурацию мутации graphql.
контрольная работа
Как показано выше, создавая две мутации, вы можете выбрать любые операционные результаты.
Создайте пользователя:
Обновить информацию о пользователе "id: 1":
Среди них в интерфейсе graphql-ui вы также можете увидеть «Документы» в правом верхнем углу.Нажмите, чтобы просмотреть описание этих двух мутаций:
Суммировать
С помощью простого «добавить, изменить и проверить» пользователя, чтобы получить предварительное представление об использовании запросов и мутаций GraphQL, вы можете использовать GraphQL в качестве предыдущего уровня уровня «шлюза» микросервисов.
Среди них всем рекомендую статью: Построение BFF с GraphQL под Microservices | InsightsTickets.wechat.qq.com/yes/hs ip5pl-да ...
"Продолжение следует"