warning: file `/Users/raezil/Desktop/grpc_graphql_gateway/examples/federation/main.rs` found to be present in multiple build targets:
* `bin` target `federation`
* `example` target `federation`
warning: file `/Users/raezil/Desktop/grpc_graphql_gateway/examples/greeter/main.rs` found to be present in multiple build targets:
* `bin` target `greeter`
* `example` target `greeter`
Compiling grpc_graphql_gateway v0.3.6 (/Users/raezil/Desktop/grpc_graphql_gateway)
warning: field `config` is never read
--> src/analytics.rs:299:5
|
298 | struct AnalyticsState {
| -------------- field in this struct
299 | config: AnalyticsConfig,
| ^^^^^^
|
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: `grpc_graphql_gateway` (lib) generated 1 warning
Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.76s
Running `target/debug/greeter`
GraphQL endpoint: http://127.0.0.1:8888/graphql
WebSocket endpoint: ws://127.0.0.1:8888/graphql/ws
Try these operations once the servers are up:
=== gRPC Backend (via GraphQL) ===
query { hello(name:"GraphQL") { message meta { correlationId from { id displayName trusted } } } }
mutation { updateGreeting(input:{ name:"GraphQL", salutation:"Howdy" }) { message } }
subscription { streamHello(name:"GraphQL") { message meta { correlationId } } }
query { user(id:"demo") { id displayName trusted } }
=== REST Connector (JSONPlaceholder API) ===
The gateway includes a REST connector for https://jsonplaceholder.typicode.com
You can execute REST endpoints programmatically via the connector:
// In your resolver or middleware:
let connector = gateway.rest_connectors().get("jsonplaceholder").unwrap();
let result = connector.execute("getPost", args).await?;
Test the REST connector directly with curl:
curl https://jsonplaceholder.typicode.com/posts/1
curl https://jsonplaceholder.typicode.com/users/1
=== File Uploads ===
# Upload (multipart): see README for the curl example
# Multi-upload (multipart): see README for the curl example
NOTE: Query whitelisting is enabled in WARN mode.
Non-whitelisted queries will log warnings but still execute.
Set WhitelistMode::Enforce in production for strict security!
NOTE: REST connector is configured for JSONPlaceholder API demo.
Use add_rest_connector() to integrate your own REST APIs!
=== Query Analytics Dashboard ===
Dashboard UI: http://127.0.0.1:8888/analytics
JSON API: http://127.0.0.1:8888/analytics/api
Reset: curl -X POST http://127.0.0.1:8888/analytics/reset
[2m2025-12-16T07:53:03.140672Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m gRPC Greeter listening on 127.0.0.1:50051
[2m2025-12-16T07:53:03.140704Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m GraphQL gateway listening on http://127.0.0.1:8888/graphql (ws://127.0.0.1:8888/graphql/ws for subscriptions)
[2m2025-12-16T07:53:03.149426Z[0m [32m INFO[0m [2mgrpc_graphql_gateway::rest_connector[0m[2m:[0m REST connector configured with 5 endpoints at https://jsonplaceholder.typicode.com
[2m2025-12-16T07:53:03.149560Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m REST connector configured from OpenAPI spec (jsonplaceholder.yaml)
[2m2025-12-16T07:53:03.149577Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m Available operations:
[2m2025-12-16T07:53:03.149589Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m - jp_listPosts: GET /posts
[2m2025-12-16T07:53:03.149601Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m - jp_getPost: GET /posts/{id}
[2m2025-12-16T07:53:03.149611Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m - jp_createPost: POST /posts
[2m2025-12-16T07:53:03.149622Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m - jp_getUser: GET /users/{id}
[2m2025-12-16T07:53:03.149631Z[0m [32m INFO[0m [2mgreeter[0m[2m:[0m - jp_listUsers: GET /users
[2m2025-12-16T07:53:03.357718Z[0m [32m INFO[0m [2mgrpc_graphql_gateway::schema[0m[2m:[0m Added 4 REST query fields and 1 REST mutation fields to schema
[2m2025-12-16T07:53:03.359495Z[0m [32m INFO[0m [2mgrpc_graphql_gateway::gateway[0m[2m:[0m Gateway server listening on 127.0.0.1:8888
[2m2025-12-16T07:53:03.815623Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: c894d6dbf7b1694a
[2m2025-12-16T07:53:03.815660Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: c894d6dbf7b1694a
[2m2025-12-16T07:53:03.823284Z[0m [32m INFO[0m [2mgrpc_graphql_gateway::middleware[0m[2m:[0m GraphQL request received [3mrequest_id[0m[2m=[0m877e5c3d-74c0-4104-9564-2bdad19b872b [3mclient_ip[0m[2m=[0mNone
[2m2025-12-16T07:53:04.230532Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 39f35789c54f8db8
[2m2025-12-16T07:53:04.230567Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 39f35789c54f8db8
[2m2025-12-16T07:53:04.240152Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 6598cef6b15fd618
[2m2025-12-16T07:53:04.240192Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 6598cef6b15fd618
[2m2025-12-16T07:53:04.282330Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 8d1d82847405fe68
[2m2025-12-16T07:53:04.282367Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 8d1d82847405fe68
[2m2025-12-16T07:53:04.302823Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 9c48f9a014aa502f
[2m2025-12-16T07:53:04.302858Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 9c48f9a014aa502f
[2m2025-12-16T07:53:04.309467Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 46e8bce118eb50db
[2m2025-12-16T07:53:04.309499Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 46e8bce118eb50db
[2m2025-12-16T07:53:04.330804Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 8b5d7e0dd17d937a
[2m2025-12-16T07:53:04.330838Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 8b5d7e0dd17d937a
[2m2025-12-16T07:53:04.338062Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 8b5d7e0dd17d937a
[2m2025-12-16T07:53:04.338092Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 8b5d7e0dd17d937a
[2m2025-12-16T07:53:04.346395Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 743e76a3e37affde
[2m2025-12-16T07:53:04.346425Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 743e76a3e37affde
[2m2025-12-16T07:53:04.352757Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 7f9411da0792b766
[2m2025-12-16T07:53:04.352778Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 7f9411da0792b766
[2m2025-12-16T07:53:04.359077Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 9c48f9a014aa502f
[2m2025-12-16T07:53:04.359100Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 9c48f9a014aa502f
[2m2025-12-16T07:53:04.365418Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 26c619256b902cd3
[2m2025-12-16T07:53:04.365439Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 26c619256b902cd3
[2m2025-12-16T07:53:04.371897Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 26c619256b902cd3
[2m2025-12-16T07:53:04.371918Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 26c619256b902cd3
[2m2025-12-16T07:53:04.386997Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::query_whitelist[0m[2m:[0m Query rejected by whitelist: Query hash: 9c48f9a014aa502f
[2m2025-12-16T07:53:04.387024Z[0m [33m WARN[0m [2mgrpc_graphql_gateway::runtime[0m[2m:[0m Query whitelist validation failed: Query not in whitelist: Query hash: 9c48f9a014aa502f