Last active
March 15, 2024 18:04
-
-
Save dunglas/f2e756725b1b842331dc8cdd38b4cc75 to your computer and use it in GitHub Desktop.
A GraphQL client using the Symfony HttpClient component
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$query = <<<'GRAPHQL' | |
query GetUser($user: String!) { | |
user (login: $user) { | |
name | |
repositoriesContributedTo { | |
totalCount | |
} | |
} | |
} | |
GRAPHQL; | |
graphql_query('https://api.github.com/graphql', $query, ['user' => 'dunglas'], 'my-oauth-token'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// composer require symfony/http-client | |
require __DIR__.'/vendor/autoload.php'; | |
use Symfony\Component\HttpClient\HttpClient; | |
use Symfony\Component\HttpClient\HttpOptions; | |
function graphql_query(string $endpoint, string $query, array $variables = [], ?string $token = null): array | |
{ | |
$options = (new HttpOptions()) | |
->setJson(['query' => $query, 'variables' => $variables]) | |
->setHeaders([ | |
'Content-Type' => 'application/json', | |
'User-Agent' => 'Symfony GraphQL client' | |
]) | |
; | |
if (null !== $token) { | |
$options->setAuthBearer($token); | |
} | |
return HttpClient::create() | |
->request('POST', $endpoint, $options->toArray()) | |
->toArray() | |
; | |
} |
<?php
// src/Service/GraphqlClient.php
namespace App\Service;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Component\HttpClient\HttpOptions;
use Symfony\Component\DependencyInjection\ContainerInterface;
class GraphqlClient
{
private HttpClientInterface $client;
private ContainerInterface $container;
public function __construct(HttpClientInterface $client, ContainerInterface $container)
{
$this->client = $client;
$this->container = $container;
}
public function query(
string $query,
array $variables = [],
?string $token = null,
string $endpoint = null
): string|array
{
if (is_null($endpoint)) {
$endpoint = $this->container->getParameter('app.graphql_url');
}
$options = (new HttpOptions())
->setJson(['query' => $query, 'variables' => $variables])
->setHeaders([
'Content-Type' => 'application/json',
'User-Agent' => 'Symfony GraphQL client'
])
;
if (null !== $token) {
$options->setAuthBearer($token);
}
$response = $this->client
->request('POST', $endpoint, $options->toArray())
->toArray();
return array_key_exists('errors', $response)
? $response['errors'][0]['message']
: $response;
}
}
The requests of this example service are profiled in Symfony 5.3 debug toolbar.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello,
Is there a way to send multiple queries :
https://hasura.io/docs/latest/graphql/core/databases/postgres/mutations/multiple-mutations.html# ?
Many thanks in advance.