Могу ли я использовать Guzzle для потребления GraphQL API?

В google-verse не так много информации об использовании GraphQL API в PHP. Есть несколько пакетов, которые, с моей точки зрения, в основном предназначены для создания вашего собственного GraphQL API, но ничего конкретного для использования. Возможно, я слишком усложняю ситуацию или решение моего вопроса очевидно. Я решил свою проблему и опубликую ответ.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
5 659
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я не хотел тянуть эти пакеты, когда едва понимал, что они предоставляют, и я просто хотел использовать те же инструменты, к которым я привык в мире REST, для легкого перехода. Ответ: Да, вы можете использовать Guzzle для использования GraphQL API.

Вероятно, есть способы сделать это красивее, но на данный момент это то, что работает. Вы проходите авторизацию через заголовок Authorization, а Content-Type должен быть установлен в application/json.

При построении запроса будьте осторожны с кавычками, пробелами и разрывами строк. Я еще не придумал, как сделать код красивее и при этом поддерживать допустимый запрос. Первая часть {"query": "query { является обязательным требованием для каждого запроса. Имя объекта должно быть заключено в двойные кавычки, а тело запроса "query { }" также должно быть заключено в двойные кавычки.

$graphQLquery = '{"query": "query { viewer { repositories(last: 100) { nodes { name id isPrivate nameWithOwner } } } } "}';

use GuzzleHttp\Client;

$response = (new Client)->request('post', '{graphql-endpoint}', [
    'headers' => [
        'Authorization' => 'bearer ' . $token,
        'Content-Type' => 'application/json'
    ],
    'body' => $graphQLquery
]);

Просто сделайте обычный почтовый запрос от guzzle. Добавьте параметры формы как запрос и переменные. Поместите свой запрос в параметры формы запроса и переменные как массив значений ключа.

  $response = $this->client->post('https://grapqlEndPoint', [
        'form_params' => [
            'query' => '
                query($username: String!) {
                    users(username: $username) {
                        username               
                    }
                }',
            'variables' => [
                'username' => $username
            ]
        ]
    ]);

    echo $response->getBody()->getContents();

Я так не думаю ... где кодировка json (требуется API graphql)? какая-то магия?

xadm 09.04.2021 13:15

Я хотел бы добавить несколько вещей к тому, что Вим Дизель упомянул в качестве ответа на свой пост.

По состоянию на 2021 год, когда я следил за форматированием кода, я получаю искаженную полезную нагрузку в качестве сообщения об ошибке. Чтобы исправить это, я удалил тело запроса query { } и использовал '"query": "query queryName{ }"'

Если вам нужно включить переменные для запроса GraphQL, вы можете сделать следующее (из Документация по GraphQL):

$graphQLquery = '{"query": "query { viewer { repositories(last: 100) { nodes { name id isPrivate nameWithOwner } } } } "}, "variables": { "isPrivate": "True", "name": "JohnDoe", ... }';

Вы можете разделить запрос, используя одинарные кавычки ' и точку . в PHP, чтобы избежать жесткого кодирования переменных, а также для форматирования.

Полный пример кода ниже того, что сработало для меня.

use GuzzleHttp\Client;

$name = 'JohnDoe';
$graphQLquery = '{'.
    '"query": "query viewer {'.
                  'repositories(last: 100) {'.
                      'nodes {'.
                         'name'. 
                         'id'. 
                         'isPrivate'. 
                         'nameWithOwner'. 
                      '}'.
                  '}'. 
             '}",'.
    '"variables": { "name": "'.$name.'", "id": "1", "isPrivate ": "True", "nameWithOwner": "VimDiesel"}'.
 '}';'



$response = (new Client)->request('post', '{graphql-endpoint}', [
    'headers' => [
        'Authorization' => $token,
        'Content-Type' => 'application/json'
    ],
    'body' => $graphQLquery
]);

Мне удалось отправить мутацию с помощью GuzzleHttp\Client, используя следующий код:

$graphQLBody = [
    'query' => 'mutation ($name: String!) {
        create(
            input:{
                name: $name,
            }
        ) {
            user {
                id,
                name,
            }
            errors {
                messages
            }
        }
    }',
    'variables' => [
        'name' => $name,
    ]
];

$response = $this->client->request('post', $this->apiEndpoint, [
    'headers' => [
        'Authorization' => 'bearer ' . $token,
        'Content-Type' => 'application/json'
    ],
    'body' => json_encode($graphQLBody)
]);

Другие вопросы по теме