lang | title | keywords | sidebar | permalink | redirect_from |
---|---|---|---|---|---|
en |
Using OpenAPI-to-GraphQL |
LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI, GraphQL |
lb4_sidebar |
/doc/en/lb4/Using-openapi-to-graphql.html |
/doc/en/lb4/exposing-graphql-apis.html |
{% include note.html content=" The OpenAPI-to-GraphQL module is a general wrapper for existing OpenAPI REST APIs. For first-class GraphQL support, see @loopback/graphql" %}
The OpenAPI-to-GraphQL module creates a GraphQL wrapper for existing REST APIs which are described by the OpenAPI specification. This tutorial shows how to expose GraphQL APIs in an existing LoopBack application.
Make sure you have a running LoopBack 4 application. In this tutorial, we'll use
the todo
example. You can create this application by running the command
below:
lb4 example todo
From your LoopBack application, run the following command to install OpenAPI-to-GraphQL and the required dependencies:
npm i --save openapi-to-graphql-cli
Make sure your LoopBack application is running by going to
http://localhost:3000/openapi.json
. If not, you can start it by running the
npm start
command.
Now we will use the OpenAPI-to-GraphQL CLI to set up a GraphQL HTTP Server backed by express on port 3001. Specifying the OpenAPI spec generated by the todo-application as the parameter, start up the server by running the following command:
npx openapi-to-graphql-cli --port=3001 http://localhost:3000/openapi.json
Haven't heard about npx
yet? It's a cool helper provided by npm
and
available out of the box since Node.js 8.x. Learn more in their announcement
blog post:
Introducing npx: an npm package runner
That’s it! You’re now ready to try out some tests and requests in the browser at http://localhost:3001/graphql.
{% include note.html content=" We are looking into ways how to expose the GraphQL endpoint alongside the main REST API, on the same HTTP host and port. See issue #1905. " %}
Here are some examples of the query
and mutation
calls:
-
To get all the to-do instances, run this query command:
query{ todos { id title desc } }
The expected output looks like this:
{ "data": { "todos": [ { "id": 1, "title": "Take over the galaxy", "desc": "MWAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA" }, { "id": 2, "title": "destroy alderaan", "desc": "Make sure there are no survivors left!" }, { "id": 3, "title": "play space invaders", "desc": "Become the very best!" }, {"id": 4, "title": "crush rebel scum", "desc": "Every.Last.One."} ] } }
-
Create a to-do instance and retrieve its ID and title in the response object using the following mutation command:
mutation { todoControllerCreate(newTodoInput: { title: "Take over the universe" }) { id title } }
The expected output looks like this:
{ "data": { "todoControllerCreate": { "id": 5, "title": "Take over the universe" } } }