Önceki yazılarda GraphQL üzerinde durmuştuk. Şimdi ise Spring Boot ile bir uygulama yazacağız. Bir yazı dizisi olarak düşündüm ve en basit uygulamadan daha karmaşık yapılara doğru ilerleyeceğiz. Bunu için aşağıdaki yazıları okumadıysanız öncelikle onları okumanızda fayda var.
- https://bilisim.io/2018/01/13/graphql-veri-erisim-modellerine-farkli-bir-yaklasim/
- https://bilisim.io/2019/05/02/graphql-yeni-nesil-api/
İlk adımımız tabii ki Hello-World uygulaması olacak ve bu uygulamayı adım adım geliştireceğiz.
Spring boot 2.2.4.RELEASE, Gradle, Java 8, DevTools ve Lombok kullanıyor olacağım.
Proje Oluşturma
Spring-Boot projesi oluşturun ve gradle.properties dosyasına aşağıdaki bağımlılıkları ekleyin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.graphql-java-kickstart:graphql-spring-boot-starter:6.0.1' runtimeOnly 'com.graphql-java-kickstart:graphiql-spring-boot-starter:6.0.1' compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '1.3.0.RELEASE' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } |
Schema Oluşturma
src/main/resource altına schema.graphqls dosyasını oluşturun ve aşağıdaki tanımı yapın.
1 2 3 4 5 6 7 |
type Query { hello: String! } |
Şimdi ise gelen bu query’i çözecek resolver yazmamız gerek.
Resolver Oluşturma
1 2 3 4 5 6 7 8 9 10 11 |
@Service public class HelloQueryResolver implements GraphQLQueryResolver{ public String hello() { return "Hello GraphQL"; } } |
Gerekli bütün işlemlerimizi yapmış olduk. Bir Schema oluşturduk gerekli type tanımlarımızı yaptık ve Query’e karşılık gelecek Resolver’ımızı yazdık.
Test
localhost:8080/graphiql üzerinden test edebiliriz. Dependency olarak GraphiQL eklemiştik. İsterseniz Postman üzerinden de aynı işlemi gerçekleştirebilirsiniz. Fakat GraphiQL oluşturduğunuz Schema’ya göre dokümantasyon oluşturuyor ve kullanışlı bir tool olduğumuz için benim tercihim GraphiQL.
1 2 3 4 5 6 7 |
{ hello } |
Yukarıdaki query’i çalıştırdığınızda aşağıdaki resimdeki gibi çıktı alacaksınız.
Buraya kadar bir problem yoksa çalışan ilk GraphQL uygulamamızı yazmış olduk. Şimdi ise senaryomuzu değiştirip, Query bir isim parametresi alsın ve o parametreye göre sonuç dönsün.
Schema’ya yeni bir Query tanımı yapmamız gerek ve dediğimiz gibi bir String parametre alacak ve yeni schema.graphqls şöyle olmalı.
1 2 3 4 5 6 7 8 |
type Query { hello: String! helloWithParameter(name: String!): String! } |
Tekrar söylemek gerekirse Schema içerisindeki Query tanımı ile QueryResolver‘ımızındaki metodlar eşleşmeli. Şimdi bu notu dikkate alarak Resolver’ımızı yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Service public class HelloQueryResolver implements GraphQLQueryResolver{ public String hello() { return "Hello GraphQL"; } public String helloWithParameter(String name) { return "Hello ".concat(name); } } |
GraphiQL üzerinden test edelim.
Uygulama kodlarına GitHub üzerinden ulaşabilirsiniz.
Faydalı olması dileğiyle.