Spring Boot ile GraphQL API – 2
Önceki yazımızda kaldığımızdan yerden devam edeceğiz. Senaryoyu değiştirerek uygulamayı adım adım ilerleteceğiz.
Proje yapısını da değiştireceğimiz için öncelikle aşağıdaki adımları yapmamız gerek.
- resolver ve model package oluşturulalım ve model package içerisine Blogger class’ını oluşturalım.
- src/main/resource altına graphql klasörü oluşturup önceki yazımızda oluşturduğumuz schema.graphqls dosyasını bu klasör içine taşıyalım. Bu işlemi yapmamızın nedeni oluşturacağımız diğer schemalar’ı tek dosya yerine, her biri için ayrı *.graphqls dosyası oluşturup schema’ları ayrı yönetmek.
Entitiy Oluşturma
Blogger entity’sini model package içerisine oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Blogger { private Long id; private String name; private String surname; private String email; private String password; } |
Schema Oluşturma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
type Blogger{ id: ID! name: String! surname: String! email: String! password: String! } extend type Query { getAllBloggers: [Blogger]! } |
Bu noktada schema dosyasında bir farklılık görüyoruz. Giriş kısmında belirttiğim gibi schema dosyalarını ayırabiliriz. Fakat tek bir root olarak Query tanımı olabilir. Bunun için de extend type Query olarak tanımlıyoruz.
Resolver Oluşturma
Tekrar üstünden geçmekte fayda var. Her Query için bir QueryResolver oluşturamamız gerek ve bu resolver’daki metod ismi ile Schema içerisinde yaptığımız tanımın ismi aynı olmalı.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
@Service public class BloggerQueryResolver implements GraphQLQueryResolver { private static List<Blogger> bloggers = new ArrayList<>(); static { List<Blogger> bloggers = new ArrayList<>(); return bloggers; } public List<Blogger> getAllBloggers() { return bloggers; } } |
Test
1 2 3 4 5 6 7 8 9 10 11 12 |
{ getAllBloggers{ id name surname email } } |
sorguladığımızda aşağıdaki sonucu alacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{ "data": { "getAllBloggers": [ { "id": "1", "name": "Alper", "surname": "AKALIN", }, { "id": "2", "name": "Kubilay", "surname": "KULAOĞLU", }, { "id": "3", "name": "Ömer", "surname": "KOÇBİL", }, ... //diğer elemanları fazla yer kaplamaması için siliyorum ] } } |
Şimdi ikinci bir Query yazalım ve parametre olarak id alsın.
Eklenen yeni Query tanımı ile yeni blogger.graphqls aşağıdaki gibi olmalı.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
type Blogger{ id: ID! name: String! surname: String! email: String! password: String! } extend type Query { getAllBloggers: [Blogger]! getBlogger(id: ID!): Blogger! } |
BloggerQueryResolver‘a aşağıdaki metodu eklememiz yeterli.
1 2 3 4 5 6 7 8 9 10 |
public Blogger getBlogger(Long id) { return (Blogger) bloggers.stream() .filter(blogger -> blogger.getId().equals(id)) .findAny() .orElse(null); } |
getBlogger query’i çağırdığımızda aşağıdaki çıktı almayı belirtiyoruz.
GitHub kodlarına aşağıdaki linkten ulaşabilirsiniz.
Faydalı olması dileğiyle.