I created graphql-rest-proxy, which converts your REST api to GraphQL server
Tags: graphql, proxy, rest, node
Published: 2019-03-26 06:46:01

---
title: I created graphql-rest-proxy, which converts your REST api to GraphQL server
published: true
description: 
tags: graphql, proxy, rest, nodejs
---


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.


![image](https://github.com/acro5piano/graphql-rest-proxy/blob/master/images/how-it-works.png?raw=true)


# Install

```sh
npm -g install graphql-rest-proxy
```

Or if you use Yarn:

```sh
yarn global add graphql-rest-proxy
```

# Getting Started

**STEP 1. Define your schema.**

`schema.graphql`

```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.**

```sh
graphql-rest-proxy schema.graphql

# => graphql-rest-proxy is running on http://localhost:5252
```

**STEP 3. Request!**

```graphql
curl -XPOST -H 'Content-Type: application/json' \
    -d '{ "query": "{ getUser { id name isActive } }" }' \
    http://localhost:5252/graphql
```

It will return like this:

```json
{
  "data": {
    "getUser": {
      "id": 1,
      "name": "Tom",
      "isActive": false
    }
  }
}
```

# Examples

**Basic Query Proxy**

```graphql
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`.

```graphql
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.

```graphql
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:

```javascript
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`.

```graphql
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.