Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - eaceto/ReGraphQL: A simple (yet effective) GraphQL to HTTP / REST router · GitHub
Skip to content

Repository files navigation

ReGraphQL

GitHub go.mod Go version

Docker Image Version (latest semver)Docker Image Size (latest semver)

GitHub Workflow Status

A simple (yet effective) GraphQL to REST / HTTP router.

ReGraphQL helps you expose your GraphQL queries / mutations as REST / HTTP endpoints. Doing this has the following benefits:

  • Queries are stored and controlled server side. No queries on the frontend.
  • Can modify and optimise your queries on demand without redoploying your (frontend) clients
  • Can use GET (HTTP Method) instead of GraphQL's POST
  • It's an OSS alternative to Kong's DeGraphQL

It helps you going...

From this

query($person: StarWarsPeople!) {
getPerson(person: $person) {
birthYeareyeColorsfilms {
title
}
genderhairColorsheighthomeworld {
name
}
massnameskinColorsspecies {
name
}
starships {
name
}
vehicles {
name
}
}
}

To

GET /persons/{person}

Index

Requirements

  • Go 1.18

Features

  • Maps HTTP params to GraphQL Variables
  • Forwards HTTP headers to GraphQL request
  • Set HTTP Status Code different to 200 if GraphQL query fails.
  • Hide GraphQL Error's Locations
  • Hide GraphQL Error's Stacktrace
  • Hide GraphQL Error's Path
  • Reads configuration from .env file
  • Reads configuration from environment variables
  • Logs using Kubernetes' klog v2
  • Docker Image below 20MB
  • Exposes metrics using Prometheus
  • Exposes Liveness, Readiness and Startup Probes

Service Endpoints

Liveness

GET /health/liveness
{"hostname":"pod_67804","status":"up"}

Returns HTTP Status Code OK (200) with the following JSON as soon as the application starts

{"hostname":"<< hostname >>","status":"up"}

Readiness

GET /health/readiness
{"hostname":"pod_67804","status":"ready"}
  1. If the application is Ready to receive requests

Returns HTTP Status Code OK (200) with the following JSON:

{"hostname":"<< hostname >>","status":"ready"}
  1. If the application is Not Ready to receive requests

Returns HTTP Status Code Precondition Failed (412) with the following JSON:

{"hostname":"<< hostname >>","status":"waiting"}

Metrics

The service exposes a Prometheus metrics endpoint at /metrics

GET /metrics# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0

Quick start

  1. Describe a route in a file using yaml, which matches your HTTP endpoint with your GraphQL endpoint and Query
routes:
- http:
uri: '/persons/{person}'method: GETgraphql:
endpoint: 'https://swapi.skyra.pw/'query: | query($person: StarWarsPeople!) { getPerson(person: $person) { birthYear eyeColors films { title } gender hairColors height homeworld { name } mass name skinColors species { name } starships { name } vehicles { name } } }

Filestarwars.yml

  1. Copy starwars.yml into /tmp/config

  2. Run the service (using Docker Compose)

[sudo] docker-compose up
  1. Query your new HTTP endpoint!
curl 'http://127.0.0.1:8080/graphql/persons/lukeskywalker' --compressed

Docker Image

Docker image is based on Google's Distroless. The final image is around 11.2MB and packs only the necessary things to run the service.

docker pull eaceto/regraphql:latest

Contributing

Before contributing to ReGraphQL, please read the instructions detailed in our contribution guide.

License

ReGraphQL is released under the MIT license. See LICENSE for details.

Author

Created by Ezequiel (Kimi) Aceto.

About

A simple (yet effective) GraphQL to HTTP / REST router

Topics

Resources

Contributing

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages