I've created graphql-rest-proxy. This tool enables to proxy GraphQL request to REST api.
https://github.com/acro5piano/graphql-rest-proxy
We all know GraphQL is great, so you want to move from REST api to GraphQL.
However, it requires a lot of effort to replace your current REST api with a brand new GraphQL server.
graphql-rest-proxy
comes in to address this issue! It proxies GraphQL to REST API according to the defined schema.
Install
npm -g install graphql-rest-proxy
Or if you use Yarn:
yarn global add graphql-rest-proxy
Getting Started
STEP 1. Define your schema.
schema.graphql
type User {
id: Int
name: String
isActive: Boolean
}
type Query {
getUser: User @proxy(get: "https://my-rest-api.com/user")
}
STEP 2. Run your proxy server.
graphql-rest-proxy schema.graphql
# => graphql-rest-proxy is running on http://localhost:5252
STEP 3. Request!
curl -XPOST -H 'Content-Type: application/json' \
-d '{ "query": "{ getUser { id name isActive } }" }' \
http://localhost:5252/graphql
It will return like this:
{
"data": {
"getUser": {
"id": 1,
"name": "Tom",
"isActive": false
}
}
}
Examples
Basic Query Proxy
type User {
id: Int
name: String
}
type Query {
getUser: User @proxy(get: "https://my-rest-api.com/user")
getUsers: [User] @proxy(get: "https://my-rest-api.com/users")
}
Query with Parameters
You can refer the id of query args by $id
.
type User {
id: Int
name: String
}
type Query {
getUserById(id: Int!): User @proxy(get: "https://my-rest-api.com/users/$id")
}
Mutation with Input Parameters
Mutation forward variables
to the REST API.
type UserInput {
name: String!
}
type User {
id: Int
name: String
}
type Mutation {
createUser(user: UserInput!): User @proxy(post: "https://my-rest-api.com/users")
updateUser(id: Int!, user: UserInput!): User @proxy(patch: "https://my-rest-api.com/users/$id")
}
Request example:
fetch('http://localhost:5252/graphql', {
method: 'patch',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: gql`
mutation UpdateUser($id: Int!, $user: UserInput!) {
updateUser(id: $id, user: $user) {
id
name
}
}
`,
variables: {
id: 1,
user: {
name: 'acro5piano',
},
},
}),
})
Nested Objects
You can refer the id of parent object by $id
.
type Post {
id: Int
title: String
}
type User {
id: Int
name: String
posts: [Post] @proxy(get: "https://my-rest-api.com/users/$id/posts")
}
type Query {
getUser: User @proxy(get: "https://my-rest-api.com/user")
}
for more information, please take a look at https://github.com/acro5piano/graphql-rest-proxy
Development Status
Still in Beta. If you have any suggestions or feature requests, feel free to open new issues or Pull Requests!
TODO:
- [ ] More type support
- [ ] Fragment
- [ ] Scalar
- [ ] Refactoring
- [ ] Logging
Please try it out and let me know your feedback/comments.
Side note
I used Rollup.js to create npm package before, but this time I tried @pika/pack.
https://www.pikapkg.com/blog/introducing-pika-pack/
@pika/pack is a great tool, which reduces a lot of steps and learning cost. For example, we can set executable command, code embedding, version managiments, and so on. I would like to write an article about @pika/pack in the future.
Top comments (0)