- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
387 lines
7.6 KiB
Markdown
387 lines
7.6 KiB
Markdown
# GraphQL Examples
|
|
|
|
This framework includes a basic GraphQL implementation with Query and Mutation support.
|
|
|
|
## GraphQL Endpoints
|
|
|
|
- **POST /graphql** - GraphQL endpoint for queries and mutations
|
|
- **GET /graphql** - GraphQL Playground (interactive editor)
|
|
- **GET /graphql/schema** - View schema definition
|
|
|
|
## Schema Definition
|
|
|
|
The current schema includes:
|
|
|
|
```graphql
|
|
type User {
|
|
id: ID!
|
|
name: String!
|
|
email: String!
|
|
age: Int
|
|
active: Boolean!
|
|
created_at: String!
|
|
}
|
|
|
|
input UserInput {
|
|
name: String!
|
|
email: String!
|
|
age: Int
|
|
active: Boolean
|
|
}
|
|
|
|
type UserStats {
|
|
total: Int!
|
|
active: Int!
|
|
inactive: Int!
|
|
average_age: Float!
|
|
}
|
|
|
|
type Query {
|
|
users(active: Boolean, limit: Int): [User!]!
|
|
user(id: ID!): User
|
|
userStats: UserStats!
|
|
}
|
|
|
|
type Mutation {
|
|
createUser(input: UserInput!): User!
|
|
updateUser(id: ID!, input: UserInput!): User
|
|
deleteUser(id: ID!): Boolean!
|
|
}
|
|
```
|
|
|
|
## Query Examples
|
|
|
|
### Get All Users
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { users { id name email active } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"users": [
|
|
{
|
|
"id": "1",
|
|
"name": "John Doe",
|
|
"email": "john@example.com",
|
|
"active": true
|
|
},
|
|
{
|
|
"id": "2",
|
|
"name": "Jane Smith",
|
|
"email": "jane@example.com",
|
|
"active": true
|
|
},
|
|
{
|
|
"id": "3",
|
|
"name": "Bob Wilson",
|
|
"email": "bob@example.com",
|
|
"active": false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Active Users Only
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { users(active: true) { id name email } }"
|
|
}'
|
|
```
|
|
|
|
### Get Limited Number of Users
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { users(limit: 2) { id name email } }"
|
|
}'
|
|
```
|
|
|
|
### Get Single User by ID
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { user(id: \"1\") { id name email age active created_at } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"user": {
|
|
"id": "1",
|
|
"name": "John Doe",
|
|
"email": "john@example.com",
|
|
"age": 30,
|
|
"active": true,
|
|
"created_at": "2024-01-01T00:00:00Z"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get User Statistics
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { userStats { total active inactive average_age } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"userStats": {
|
|
"total": 3,
|
|
"active": 2,
|
|
"inactive": 1,
|
|
"average_age": 30.0
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Mutation Examples
|
|
|
|
### Create New User
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "mutation { createUser(input: { name: \"Alice Johnson\", email: \"alice@example.com\", age: 28, active: true }) { id name email age active created_at } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"createUser": {
|
|
"id": "4",
|
|
"name": "Alice Johnson",
|
|
"email": "alice@example.com",
|
|
"age": 28,
|
|
"active": true,
|
|
"created_at": "2024-08-08T10:30:00Z"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Update Existing User
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "mutation { updateUser(id: \"1\", input: { name: \"John Smith\", age: 31 }) { id name email age } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"updateUser": {
|
|
"id": "1",
|
|
"name": "John Smith",
|
|
"email": "john@example.com",
|
|
"age": 31
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Delete User
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "mutation { deleteUser(id: \"3\") }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"deleteUser": true
|
|
}
|
|
}
|
|
```
|
|
|
|
## Using Variables
|
|
|
|
### Query with Variables
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query GetUser($userId: ID!) { user(id: $userId) { id name email } }",
|
|
"variables": { "userId": "1" }
|
|
}'
|
|
```
|
|
|
|
### Mutation with Variables
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "mutation CreateUser($input: UserInput!) { createUser(input: $input) { id name email } }",
|
|
"variables": {
|
|
"input": {
|
|
"name": "Charlie Brown",
|
|
"email": "charlie@example.com",
|
|
"age": 22,
|
|
"active": true
|
|
}
|
|
}
|
|
}'
|
|
```
|
|
|
|
## Complex Queries
|
|
|
|
### Multiple Queries in One Request
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { users(active: true) { id name email } userStats { total active } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"users": [
|
|
{
|
|
"id": "1",
|
|
"name": "John Doe",
|
|
"email": "john@example.com"
|
|
},
|
|
{
|
|
"id": "2",
|
|
"name": "Jane Smith",
|
|
"email": "jane@example.com"
|
|
}
|
|
],
|
|
"userStats": {
|
|
"total": 3,
|
|
"active": 2
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Using Aliases
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { activeUsers: users(active: true) { id name } inactiveUsers: users(active: false) { id name } }"
|
|
}'
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Invalid Query
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { nonexistentField }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"errors": [
|
|
{
|
|
"message": "Query field 'nonexistentField' not found",
|
|
"extensions": {
|
|
"code": "VAL_BUSINESS_RULE_VIOLATION"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### User Not Found
|
|
|
|
```bash
|
|
curl -X POST https://localhost/graphql \
|
|
-H "Content-Type: application/json" \
|
|
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \
|
|
-d '{
|
|
"query": "query { user(id: \"999\") { id name } }"
|
|
}'
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"data": {
|
|
"user": null
|
|
}
|
|
}
|
|
```
|
|
|
|
## GraphQL Playground
|
|
|
|
Visit https://localhost/graphql in your browser to access the interactive GraphQL Playground:
|
|
|
|
- **Query Editor**: Write and test GraphQL queries
|
|
- **Variables Panel**: Define query variables
|
|
- **Results Panel**: View query results
|
|
- **Schema Explorer**: Browse available types and fields
|
|
- **Execute Button**: Run queries with Ctrl+Enter
|
|
|
|
## Best Practices
|
|
|
|
1. **Use Field Selection**: Only request fields you need
|
|
2. **Use Variables**: For dynamic queries and better caching
|
|
3. **Handle Errors**: Always check for errors in responses
|
|
4. **Batch Operations**: Combine multiple queries when possible
|
|
5. **Type Safety**: Use proper types in mutations
|
|
6. **Validation**: Validate input data before mutations
|
|
7. **Caching**: Consider caching strategies for queries |