@MrPofix

Как в Apollo (GraphQL) менять урл запроса (эндпоинта)?

На бэке настроены схемы (урлы):
site.ru/graphql - для всех запросов (не авторизованных)
site.ru/graphql/auth - только для авторизованных

На фронте используется библиотека Apollo:
const client = new ApolloClient({
  uri: 'http://site.ru/graphql',
});


Вопрос: каким образом я могу менять УРЛ в зависимости от типа запроса?

Можно объединять HttpLink, но, как я понял, он делает это при инициализации (например, если есть JWT токен, он подставляет в Headers).
Но в хуке useQuery() на нашел возможности передать какие-то доп.параметры, чтобы сказать: этот запрос для авторизованных, так что используй путь graphql/auth.

Уже второй день не могу нагуглить решение... Возможно, это не правильный подход? Как решается проблема общих и авторизованных запросов?
Направьте, пожалуйста, в нужную сторону)
Спасибо!
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
@MrPofix Автор вопроса
В общем, решения по моему вопросу так и не нашёл. Кто задался таким же вопросом - рассказываю, как решил задачу.

Я использую библиотеку https://github.com/rebing/graphql-laravel
В конфигах есть настройка схем, ну я и настроил изначально общие роуты под default, приватные - под auth:
'schemas' => [
        'default' => [
            'query' => [
                \App\Http\GraphQL\Queries\UserQuery::class,              
            ],
            'mutation' => [
                'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,              
            ],
            'middleware' => [ ],
            'method' => ['get', 'post'],
        ],

        'auth' => [
            'query' => [
                \App\Http\GraphQL\Queries\GetMyProfileQuery::class,              
            ],
            'mutation' => [],
            'middleware' => [
                'api'
            ],
            'method' => [ 'post'],
        ],
    ],


В итоге перенёс все роуты в блок default:
'schemas' => [
        'default' => [
            'query' => [
                \App\Http\GraphQL\Queries\UserQuery::class,             
                 \App\Http\GraphQL\Queries\GetMyProfileQuery::class,              
            ],
            'mutation' => [
                'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,              
            ],
            'middleware' => ['jwtAuth' ],
            'method' => ['get', 'post'],
        ],
    ],


Сделал Middleware (jwtAuth), который по JWT токену пытается авторизовать юзера (если токен передан - авторизует).

Для приватных роутов сделал базовый класс с проверкой на авторизацию (соответственно, все приватные контроллеры наследую от него):

abstract class _BaseQuery extends Query
{
    public function authorize(
        $root,
        array $args,
        $ctx,
        ResolveInfo $resolveInfo = null,
        Closure $getSelectFields = null
    ): bool {
        return Auth::check();
    }
}


Таким образом, задача решена. Но чувство прекрасного страдает, так как мне не нравится такое решение )
Если нет возможность менять УРЛ запроса, то к чему настройки схемы в rebing/graphql-laravel...

UPD. Спустя несколько дней разработки, случайно наткнулся на решение:
import { ApolloClient, HttpLink, InMemoryCache } from "@apollo/client";
import { RetryLink } from "@apollo/client/link/retry";

const directionalLink = new RetryLink().split(
  (operation) => operation.getContext().version === 1,
  new HttpLink({ uri: "http://localhost:4000/v1/graphql" }),
  new HttpLink({ uri: "http://localhost:4000/v2/graphql" })
);

const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: directionalLink,
});

https://www.apollographql.com/docs/react/data/erro...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы