Démarrage de GraphiQL

@HugoTrentesaux

Au démarrage de GraphiQL, une première request est envoyée à wwServer, dont le Body est vide, d’où l’erreur renvoyée par wwServer. En fait, je pense que ce n’est pas une erreur, mais un autre type de demande (websocket ???). Ensuite il y a une demande correcte d’introspection à laquelle wwServer répond sans problème, mais sans effets non plus.
Est-ce que tu as vu cette doc de graphiQL ?

## Create Fetcher

a utility for generating a full-featured `fetcher` for GraphiQL including `@stream`, `@defer` `IncrementalDelivery`and `multipart` and subscriptions using `graphql-ws` or the legacy websockets protocol

under the hood, it uses [`graphql-ws`](https://www.npmjs.com/package/graphql-ws) client and [`meros`](https://www.npmjs.com/package/meros) which act as client reference implementations of the [GraphQL over HTTP Working Group Spec](https://github.com/graphql/graphql-over-http) specification, and the most popular transport spec proposals

### Setup

[`graphiql`](https://npmjs.com/package/graphiql) and thus `react` and `react-dom` should already be installed.

you'll need to install `@graphiql/toolkit`

```bash
npm install --save @graphiql/toolkit
yarn add @graphiql/toolkit

Getting Started

We have a few flexible options to get you started with the client. It’s meant to cover the majority of common use cases with a simple encapsulation.

Default HTTP/Multipart IncrementalDelivery Usage

Here’s a simple example. In this case, a websocket client isn’t even initialized, only http (with multipart @stream and @defer Incremental Delivery support of course!).

import * as React from 'react';
import ReactDOM from 'react-dom';
import { GraphiQL } from 'graphiql';
import { createGraphiQLFetcher } from '@graphiql/toolkit';

const url = 'https://myschema.com/graphql';

const fetcher = createGraphiQLFetcher({ url });

export const App = () => <GraphiQL fetcher={fetcher} />;

ReactDOM.render(document.getElementByID('graphiql'), <App />);

Adding graphql-ws websockets subscriptions

first you’ll need to install graphql-ws as a peer dependency:

npm install --save graphql-ws
yarn add graphql-ws

Just by providing the subscriptionUrl, you can also generate a graphql-ws client. This client now supports both HTTP/Multipart Incremental Delivery for @defer and @stream, and websockets subscriptions

import * as React from 'react';
import ReactDOM from 'react-dom';
import { GraphiQL } from 'graphiql';
import { createGraphiQLFetcher } from '@graphiql/toolkit';

const url = 'https://myschema.com/graphql';

const subscriptionUrl = 'wss://myschema.com/graphql';

const fetcher = createGraphiQLFetcher({
  url,
  subscriptionUrl,
});

export const App = () => <GraphiQL fetcher={fetcher} />;

ReactDOM.render(document.getElementByID('graphiql'), <App />);

You can further customize the graphql-ws implementation by creating a custom client instance and providing it as the wsClient parameter

Options

url (required)

This is url used for all HTTP requests, and for schema introspection.

subscriptionUrl

This generates a graphql-ws client using the provided url. Note that a server must be compatible with the new graphql-ws subscriptions spec for this to work.

wsClient

provide your own subscriptions client. bypasses subscriptionUrl. In theory, this could be any client using any transport, as long as it matches graphql-ws Client signature.

legacyWsClient or legacyClient

provide a legacy subscriptions client using subscriptions-transport-ws protocol. bypasses subscriptionUrl. In theory, this could be any client using any transport, as long as it matches subscriptions-transport-ws Client signature.

headers

Pass headers to any and all requests

fetch

Pass a custom fetch implementation such as isomorphic-feth

Customization Examples

Custom wsClient Example using graphql-ws

Just by providing the wsClient

import * as React from 'react';
import ReactDOM from 'react-dom';
import { GraphiQL } from 'graphiql';
import { createClient } from 'graphql-ws';
import { createGraphiQLFetcher } from '@graphiql/toolkit';

const url = 'https://myschema.com/graphql';

const subscriptionUrl = 'wss://myschema.com/graphql';

const fetcher = createGraphiQLFetcher({
  url,
  wsClient: createClient({
    url: subscriptionUrl,
    keepAlive: 2000,
  }),
});

export const App = () => <GraphiQL fetcher={fetcher} />;

ReactDOM.render(document.getElementByID('graphiql'), <App />);

Custom legacyClient Example

(not reccomended)

By providing the legacyClient you can support a subscriptions-transport-ws client implementation, or equivalent

import * as React from 'react';
import ReactDOM from 'react-dom';
import { GraphiQL } from 'graphiql';
import { SubscriptionClient } from 'subscriptions-transport-ws';
import { createGraphiQLFetcher } from '@graphiql/toolkit';

const url = 'https://myschema.com/graphql';

const subscriptionUrl = 'wss://myschema.com/graphql';

const fetcher = createGraphiQLFetcher({
  url,
  legacyWsClient: new SubscriptionsClient(subscriptionUrl),
});

export const App = () => <GraphiQL fetcher={fetcher} />;

ReactDOM.render(document.getElementByID('graphiql'), <App />);

you will need to install the client seperately:

yarn add subscriptions-transport-ws
npm install --save subscriptions-transport-ws

and instantiate a client instance following their readme, and pass it as legacyWsClient.

Custom fetcher Example

For SSR, we might want to use something like isomorphic-fetch

import * as React from 'react';
import ReactDOM from 'react-dom';
import { GraphiQL } from 'graphiql';
import { fetch } from 'isomorphic-fetch';
import { createGraphiQLFetcher } from '@graphiql/toolkit';

const url = 'https://myschema.com/graphql';

const fetcher = createGraphiQLFetcher({
  url,
  fetch,
});

export const App = () => <GraphiQL fetcher={fetcher} />;

ReactDOM.render(document.getElementByID('graphiql'), <App />);

Credits

This is originally inspired by graphql-subscriptions-fetcher created by @Urigo

En fait, GraphiQL ne demande qu’une requête POST mais le navigateur envoie également une requête OPTIONS.

Capture d’écran de 2021-12-31 17-04-46

Je t’en avais déjà parlé, mais je ne pense pas que ce soit lié à l’erreur qu’affiche graphiql dans la partie droite.

image

Mais je n’ai toujours pas idée d’où ça vient.

Pour l’installation, je ne me suis pas embêté, j’ai simplement copié et modifié l’index.html de l’exemple avec CDN : graphiql/examples/graphiql-cdn at main · graphql/graphiql · GitHub

Excuse mon incompétence, mais cela donne quoi ?

Les requêtes OPTIONS c’est généralement pour le CORS, la page cliente n’est pas hébergée au même endroit que le serveur de l’API.

J’obtiens bien, effectivement, une requête OPTIONS. Je ne sais pas si c’est une bonne idée, mais je n’y réponds pas. Cela évite une erreur de wwServer, mais ne change pas l’erreur de syntaxe de GraphiQL au démarrage.
Et la requête d’introspection à laquelle wwServer répond ne permet pas le déclenchement de l’auto-complétion. C’est frustrant.