🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Definizione di Oggetti e Campi in GraphQL: Guida Completa

Codegrind Team•Aug 28 2024

Gli oggetti e i campi sono i blocchi fondamentali di uno schema GraphQL. Un oggetto rappresenta un’entità del tuo dominio, come un utente o un prodotto, mentre i campi definiscono le proprietà e le relazioni di quell’oggetto. In questa guida, esploreremo come definire oggetti e campi nello schema GraphQL, come gestire le relazioni tra i tipi, e come utilizzare gli argomenti e le direttive per creare schemi più potenti e flessibili.

1. Definizione degli Oggetti

In GraphQL, un oggetto è un tipo che contiene un insieme di campi. Ogni campo rappresenta una proprietà o una relazione con un altro tipo. Un tipo oggetto è definito nello schema GraphQL con la parola chiave type.

1.1. Definire un Tipo Oggetto

Supponiamo di avere un sistema di gestione dei contenuti (CMS) con due entità principali: Post e Author. Definiremo un oggetto Post che ha un titolo, un contenuto, e un autore.

Crea un file schema.js:

const { gql } = require("apollo-server");

const typeDefs = gql`
  type Post {
    id: ID!
    title: String!
    content: String!
    author: Author!
  }

  type Author {
    id: ID!
    name: String!
    posts: [Post!]!
  }
`;

module.exports = typeDefs;

In questo esempio:

  • Post è un tipo oggetto che rappresenta un post nel blog.
  • Ogni Post ha un campo id di tipo ID!, un campo title di tipo String!, un campo content di tipo String!, e un campo author che è un altro tipo oggetto Author.
  • Author è un tipo oggetto che rappresenta l’autore del post, con una relazione uno-a-molti con i post (posts: [Post!]!).

1.2. Campi Obbligatori e Facoltativi

In GraphQL, puoi definire se un campo è obbligatorio o facoltativo utilizzando il punto esclamativo (!).

  • String! indica che il campo è obbligatorio.
  • String (senza !) indica che il campo è facoltativo e può essere null.

1.3. Relazioni tra Oggetti

Le relazioni tra oggetti sono definite utilizzando altri tipi oggetto come tipo di campo. Ad esempio, un Post ha un autore (Author), e un autore ha una lista di post ([Post!]!).

2. Definizione dei Campi

I campi in un tipo oggetto definiscono le proprietà che possono essere richieste dai client. I campi possono avere vari tipi, inclusi tipi scalari (es. String, Int, Float, Boolean, ID), tipi oggetto, tipi di input, e tipi enumerativi.

2.1. Campi con Tipi Scalari

I tipi scalari sono i tipi di dati di base in GraphQL. Ecco alcuni esempi:

  • String: Una stringa di testo.
  • Int: Un numero intero.
  • Float: Un numero a virgola mobile.
  • Boolean: Un valore booleano (true o false).
  • ID: Un identificatore univoco, solitamente utilizzato per chiavi primarie.
type User {
  id: ID!
  username: String!
  age: Int
  isActive: Boolean!
}

In questo esempio, id e username sono campi obbligatori, age è facoltativo, e isActive è un campo booleano obbligatorio.

2.2. Campi con Argomenti

I campi in GraphQL possono accettare argomenti che ne influenzano il comportamento. Gli argomenti sono simili ai parametri di una funzione.

type Query {
  post(id: ID!): Post
  posts(limit: Int, offset: Int): [Post!]!
}
  • La query post accetta un argomento id per restituire un singolo post.
  • La query posts accetta gli argomenti limit e offset per supportare la paginazione.

2.3. Campi con Default Values

Gli argomenti possono avere valori di default. Se un client non fornisce un argomento, viene utilizzato il valore di default.

type Query {
  posts(limit: Int = 10): [Post!]!
}

In questo esempio, se limit non viene fornito, verrà utilizzato il valore di default 10.

3. Direttive sui Campi

Le direttive permettono di modificare il comportamento dei campi in modo dinamico. Una direttiva comune in GraphQL è @deprecated, che indica che un campo non dovrebbe più essere utilizzato.

3.1. Esempio di Direttiva @deprecated

type User {
  id: ID!
  username: String!
  email: String @deprecated(reason: "Use 'contactEmail' instead")
  contactEmail: String!
}

In questo esempio, il campo email è deprecato e dovrebbe essere sostituito da contactEmail.

3.2. Direttive Personalizzate

Puoi creare direttive personalizzate per applicare logiche specifiche. Ad esempio, una direttiva @auth potrebbe essere utilizzata per limitare l’accesso a certi campi solo agli utenti autenticati.

4. Best Practices per Definire Oggetti e Campi

4.1. Usare Nomi Descrittivi

Scegli nomi di campi e tipi che siano descrittivi e facilmente comprensibili. Evita abbreviazioni non comuni e assicurati che il nome rifletta chiaramente lo scopo del campo o tipo.

4.2. Organizzare lo Schema in Moduli

Suddividi lo schema in moduli separati per tipi, query, mutazioni e subscription. Questo rende più facile la gestione e la manutenzione dello schema.

4.3. Documentare i Tipi e i Campi

Aggiungi descrizioni chiare ai tipi e ai campi per facilitare la comprensione dello schema da parte degli sviluppatori che lo utilizzano.

"""
Rappresenta un post del blog.
"""
type Post {
  id: ID!
  title: String!
  content: String!
  author: Author!
}

4.4. Deprecare Campi e Tipi Obsoleti

Se un campo o un tipo diventa obsoleto, deprecalo anziché rimuoverlo immediatamente. Questo dà ai client il tempo di adattarsi.

4.5. Evitare Troppi Campi Facoltativi

Troppi campi facoltativi possono rendere lo schema complesso e difficile da utilizzare. Cerca di definire chiaramente quali campi sono obbligatori e quali possono essere opzionalmente omessi.

Conclusione

Definire oggetti e campi nello schema GraphQL è un passo cruciale nella progettazione di un’API robusta e scalabile. Utilizzando i principi e le best practices descritti in questa guida, puoi costruire uno schema che sia facile da comprendere, estendere e mantenere. Che tu stia lavorando con tipi semplici o relazioni complesse, una buona definizione di oggetti e campi è essenziale per il successo a lungo termine della tua API GraphQL.