GraphQL-API'er med Spring Boot · Lektion

Implementering af interfaces og union-typer

Brug interfaces og union-typer til at skabe fleksible og polymorfe skemadesigns.

Lektion 2 af 411 trin

Implementering af interfaces og union-typer er en gratis GraphQL-API'er med Spring Boot-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i GraphQL-API'er med Spring Boot, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.

Fleksible skemaer med polymorfi

GraphQL giver dig mulighed for at designe meget fleksible API'er. Nogle gange har du brug for et felt, der kan returnere forskellige objekttyper, eller du vil definere et fælles sæt felter, som flere typer skal implementere. Det er her, polymorfi kommer ind i billedet.

Vi undersøger to centrale begreber til dette: interfaces og uniontyper.

Forståelse af GraphQL-interfaces

Forestil dig, at du har forskellige medietyper som en Book og en Movie. Begge kan have en title og et releaseYear. I stedet for at duplikere disse felter kan du definere en grænseflade.

En grænseflade er en kontrakt, der angiver et sæt felter, som enhver type, der implementerer den, skal indeholde. Den fungerer som en skabelon for fælles funktionalitet.

Definition af en grænseflade i SDL

I GraphQL's Schema Definition Language (SDL) defineres en grænseflade ved hjælp af nøgleordet interface. Her definerer vi en Media-grænseflade, som både Book og Movie deler.

interface Media {
  id: ID!
  title: String!
  releaseYear: Int
}

Typer, der implementerer en grænseflade

Lad os nu få vores Book- og Movie-typer til at implementere Media-grænsefladen. De skal indeholde alle felter, der er defineret af Media, og kan tilføje deres egne unikke felter. Bemærk nøgleordet implements.

type Book implements Media {
  id: ID!
  title: String!
  releaseYear: Int
  author: String
  pages: Int
}

type Movie implements Media {
  id: ID!
  title: String!
  releaseYear: Int
  director: String
  durationMinutes: Int
}

Resolvers til grænseflader

Når du forespørger på et felt, der returnerer en grænsefladetype, finder Spring GraphQL automatisk den konkrete type ud fra dataene. Du opretter normalt Java-dataklasser, der implementerer en fælles Java-grænseflade, og Spring GraphQL håndterer resten. Prøv at køre dette eksempel:

package com.coddykit.graphql;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.ArrayList;

@SpringBootApplication
public class GraphqlApp {
    public static void main(String[] args) {
        SpringApplication.run(GraphqlApp.class, args);
    }
}

interface Media {
    String getId();
    String getTitle();
    Integer getReleaseYear();
}

record Book(String id, String title, Integer releaseYear, String author, Integer pages) implements Media {}
record Movie(String id, String title, Integer releaseYear, String director, Integer durationMinutes) implements Media {}

@Controller
class MediaController {

    @QueryMapping
    public List<Media> allMedia() {
        List<Media> mediaList = new ArrayList<>();
        mediaList.add(new Book("b1", "The Hitchhiker's Guide", 1979, "Douglas Adams", 193));
        mediaList.add(new Movie("m1", "Inception", 2010, "Christopher Nolan", 148));
        return mediaList;
    }
}

Udforskning af GraphQL-unionstyper

Hvor grænseflader sikrer, at typer deler fælles felter, gør unionstyper det muligt for et felt at returnere en af flere forskellige typer uden at kræve, at de deler fælles felter. Tænk på det som en enten-eller-situation. Et søgeresultat kan for eksempel være et Product ELLER en User.

Skemadefinition for unioner

I SDL defineres unionstyper ved hjælp af nøgleordet union efterfulgt af de typer, som den kan repræsentere, adskilt af en lodret streg |. Her er en SearchResult-union, der enten kan være en Book eller en Movie.

union SearchResult = Book | Movie

Resolvers til unionstyper

Når et felt returnerer en unionstype, skal Spring GraphQL vide, hvilken konkret type det er. I Java returnerer du blot en instans af en af de typer, der er defineret i unionen. Spring GraphQL tilføjer automatisk feltet __typename, så klienter kan skelne mellem typerne. Prøv at køre dette eksempel:

package com.coddykit.graphql;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;

@SpringBootApplication
public class GraphqlApp {
    public static void main(String[] args) {
        SpringApplication.run(GraphqlApp.class, args);
    }
}

record Book(String id, String title, Integer releaseYear, String author, Integer pages) {}
record Movie(String id, String title, Integer releaseYear, String director, Integer durationMinutes) {}

@Controller
class SearchController {

    @QueryMapping
    public Object search(@Argument String query) {
        if (query.equalsIgnoreCase("inception")) {
            return new Movie("m1", "Inception", 2010, "Christopher Nolan", 148);
        } else if (query.equalsIgnoreCase("hitchhiker")) {
            return new Book("b1", "The Hitchhiker's Guide", 1979, "Douglas Adams", 193);
        }
        return null;
    }
}

Valg mellem grænseflader og unioner

Både grænseflader og unioner tilbyder polymorfi, men de har forskellige formål:

  • Grænseflader: Brug dem, når flere typer deler et fælles sæt felter og en fælles adfærd. De håndhæver en kontrakt.
  • Unionstyper: Brug dem, når et felt kan returnere en af flere forskellige typer, som ikke nødvendigvis deler fælles felter. Det handler om »enten A eller B eller C«.

Quiz om grænseflader og unioner

Du designer en GraphQL-API. Du har brug for et felt, der enten kan returnere et Photo-objekt eller et Video-objekt. Disse to typer har helt forskellige felter og deler ingen fælles egenskaber. Hvilken GraphQL-skemaegenskab er bedst egnet til dette scenarie?

Opsummering: Fleksible skemaer

Du har lært, hvordan GraphQL-grænseflader og unionstyper muliggør fleksible og polymorfe skemadesign. Grænseflader definerer en kontrakt for fælles felter, mens unionstyper gør det muligt for et felt at returnere en af flere forskellige typer. Disse værktøjer er afgørende for at bygge robuste og tilpasningsdygtige GraphQL-API'er.

Nu skal du udforske inputtyper for at forenkle mutationsargumenter.

Gratis at komme i gang

Lær GraphQL-API'er med Spring Boot med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Implementering af interfaces og union-typer” gratis?

Ja — hele teksten til “Implementering af interfaces og union-typer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af GraphQL-API'er med Spring Boot-kurset, skal du opgradere til CoddyKit PRO. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Implementering af interfaces og union-typer”?

Brug interfaces og union-typer til at skabe fleksible og polymorfe skemadesigns. Du øver dig i GraphQL-API'er med Spring Boot med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på GraphQL-API'er med Spring Boot?

Der kræves ingen tidligere erfaring. GraphQL-API'er med Spring Boot på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Implementering af interfaces og union-typer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne GraphQL-API'er med Spring Boot-lektion?

Ja. Alle GraphQL-API'er med Spring Boot-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Modellering af indlejrede objekter og relationer
  2. Implementering af interfaces og union-typer
  3. Brug af input-typer til mutationer
  4. Enums og brugerdefinerede scalar-typer
← Tilbage til GraphQL-API'er med Spring Boot