What is GraphQL?
GraphQL is a query language for APIs
from: https://graphql.org/
We got a result by throwing POST request to one endpoint.
The curl
command below is an example to get messages.
$ curl -H "Content-Type: application/json" -X POST -d '
{
"query": "{ messages { name body } }"
}
' http://xxxxxxxxxxxxxxxxxx-cn-shanghai.alicloudapi.com/
{"data":{"messages":[{"body":"Hello","name":"asmsuechan"},{"body":"World","name":"suechan"}]}}
For more information, please google graphql. I don't go detailed explanations about it in this article.
Minimum Code
First, I wrote the minimum GraphQL code and made it work on Function Compute.
I expected the combination of query and return value below:
Query: "{ hello }"
Return Value: { data: { hello: "world" } }
This sample below came from Official GitHub.
// index.js
const { hook } = require('fc-helper');
const {
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLString
} = require('graphql');
const schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'RootQueryType',
fields: {
hello: {
type: GraphQLString,
resolve() {
return 'world';
}
}
}
})
});
const query = '{ hello }';
module.exports.handler = (event, context, callback) => {
graphql(schema, query).then((result) => {
callback(null, { statusCode: 200, body: result });
});
});
It's easy. Just exec graphql()
in the handler function.
More detailed API
Next, I made the API better. I expected the combination of query and return values below"
Query: "{ messages { name body } }"
Return value: {"data":{"messages":[{"body":"Hello","name":"asmsuechan"},{"body":"World","name":"suechan"}]}}
I defined a type named message
to get plural message
.
// index.js
const { hook } = require('fc-helper');
const {
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLList,
GraphQLString
} = require('graphql');
const atob = require('atob');
const messages = [
{
name: 'asmsuechan',
body: 'Hello'
},
{
name: 'suechan',
body: 'World'
}
];
const schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'RootQueryType',
fields: {
messages: {
type: GraphQLList(
new GraphQLObjectType({
name: 'message',
fields: {
name: { type: GraphQLString },
body: { type: GraphQLString },
},
}),
),
resolve() {
return messages;
}
}
}
})
});
module.exports.handler = (event, context, callback) => {
const request = JSON.parse(event.toString('utf8'))
const query = JSON.parse(atob(request["body"]))["query"]
graphql(schema, query).then((result) => {
callback(null, { statusCode: 200, body: result });
});
};
I saw it works fine by executing curl
.
$ curl -H "Content-Type: application/json" -X POST -d '
{ "query": "{ messages { name body } }"}
'http://xxxxxxxxxxxxxxxxxx-cn-shanghai.alicloudapi.com/
{"data":{"messages":[{"body":"Hello","name":"asmsuechan"},{"body":"World","name":"suechan"}]}}
Conclution
It's very happy to use GraphQL instead of REST API on Function Compute + API Gateway because we can create complex APIs without many API Gateways.
However, it's too fast to run as production environment.
Here's my repository of this article:
Top comments (0)