Ana içeriğe atla

Java ile restful api kodlamanın en kolay yolu (Spring boot - mongodb )


Merhaba arkadaşlar,

Bu yazımda sizlere Java EE ile nasıl restful (Representational State Transfer) api (Application Programing Interface) mimarisi üzerine kurulu, web servisi en kolay şekilde hazırlayabileceğimizi örnekle anlatmaya çalışacağım.Başlıkta belirttiğim gibi hem logical koda odaklanabilmek hemde kısa sürede test edebilmek için Spring framework ve gömülü Mongodb kullanacağız.

Öncelikle yapmaya çalıştığımız teknolojinin ne olduğunu, ne işe yaradığını ve nerelerde kullanabileceğimizi kısaca anlatmaya çalışayım...

Restful nedir ?

REST mimarisini kullanan web servisler Restful Web Service olarak adlandırılırlar. Kolay ve anlaşılırdır ve bir standardı olmadığı için WDSL ye ihtiyaç yoktur, extra kütüphaneneye ihtiyaç duymadan çalışabilir. Java'da bu teknolojinin adı JAX-RS olarak geçmektedir fakat refereans olarak Jersey gösterilir çünkü Java'nın restful api sine en yakın olan frameworktur, notasyonlar aynı JSR 311 dekileri implement etmektedir dolayısıyla daha kolay şekilde kendi Restful web servisimizi inşaa etmemizi kolaylaştırmaktadır. Daha fazla detay için Java'nın resmi sitesinden destek alabilirsiniz.

Ne işe yarar ?

Hızlı, stabil ve ölçeklenebilir bir şekilde veri transferi yapmamızı sağlar, durumsuz olduğu için sunucuda istemci bilgileri tutulmaz, birçok formatta veri sunumu yapılabilir bunlardan bağzıları JSON, HTML, XML vs dir.

Nerede kullanılabilir ?

Uygulamamızın belli özelliklerini ve ya işlevlerini başka bir uygulamada implement edebilmek için kullanılır.Örnek vermek gerekirse bankalarda ödeme sistemleri, Twitter' da twit atmak ve ya profil'e ulaşmak için, Google Fit, Drive 'da istenilen bilgilere ulaşmak gibi birçok örnek verebileceğimiz kullanım alanı vardır.

 Gelelim uygulamamızı kodlamaya : 

Bu uygulamayı inşa etmek için izlenebilir birçok yöntem vardır, ister saf Java ile ister framework kullanarak yazabilirsiniz.Ben Spring frameworku tercih edeceğim ve bunun sebebini birazdan anlayacaksınız :)

Spring frameworkun bir parçası olan "Boot", konfigürasyon gerektirmeyen, sadece gereken kodları yazmamızı sağladığı için Spring-boot'u kullanacağız. Hemen https://start.spring.io/ sayfasına girip gerekli alanları dolduruyoruz : 
  • Project = Maven
  • Language = Java
  • Version = 1.5.10 
  • Group name = istediğiniz ismi yazabilirsiniz , tamamen size kalmış.
  • Artifact = istediğiniz ismi yazabilirsiniz , tamamen size kalmış.
  • Search for dependencies = İki kütüphane implement etmemiz yeterli olacaktır bunlar için "Web" yazıp entere basın ve tekrardan "MongoDB" yazıp enter basın hemen aşağıda eklemiş olduğumuz kütüphaneler yeşil renkte iki button şekli görünecektir. 
  • Sayfanın altında büyük yeşil renkli "Generate Project" buttonuna tıklayarak hazırlamış olduğumuz projemizi indiriyoruz.  
  • Son olarak IDE mizde Maven project olarak import ediyoruz.
Dilerseniz nasıl yapılacağını aşağıdaki videoyu izleyerek öğrenebilirsiniz : 


Projemizi veri tabanına bağlı olarak test edebilmek için gömülü Mongo veri tabanını Pom.xml 'e şu şekilde eklememiz gerekiyor : 

<dependency>
      <groupid>de.flapdoodle.embed</groupid>
      <artifactid>de.flapdoodle.embed.mongo</artifactid>

</dependency> 

Maven Pom.xml dosyamızın son görünümü şu şekilde olacaktır. Geriye sadece kodlamak kaldı...
Projemizin paketlere bölünüşünü ben şu şekilde yaptım : 

İlk olarak Service paketi altında yer alan Film.java sınıfımızı oluşturalım.


import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "Film")
public class Film {

 @Id
 private String Id;
 private String name;
 private String actor;
 private String releaseDate;
 
 public Film() {}

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getActor() {
  return actor;
 }

 public void setActor(String actor) {
  this.actor = actor;
 }

 public String getReleaseDate() {
  return releaseDate;
 }

 public void setReleaseDate(String releaseDate) {
  this.releaseDate = releaseDate;
 }

 public Film(String name, String actor, String releaseDate) {
  this.name = name;
  this.actor = actor;
  this.releaseDate = releaseDate;
 }

 @Override
 public String toString() {
  return "Film [name=" + name + ", actor=" + actor + ", releaseDate=" + releaseDate + "]";
 }

 
}



Burada açıklama gereksimi duyduğum 2 tane annotation var;
  1. @Document(collection = "Film") : Vari tabanındaki tablomuzun adını belirliyoruz.
  2. @Id : Identity demek oluyor bu da her film nesnesi için bir anahtar oluşturmaya yarar.
Hemen ardından aynı paket altında FilmRepository.java adında bir interface oluşturuyoruz : 


import org.springframework.data.mongodb.repository.MongoRepository;

public interface FilmRepository extends MongoRepository {
 
 public Film findByName(String name);
 
 public void deleteByName(String name);
}

Bu interfacete Spring'in hazırda CRUD (create, read, update, delete) işlemlerini içinde barındıran interface sini extend ederek hem vakitten tasarruf hemde fazla kod yazmaktan kurtulmuş oluyoruz 😊 sadece bazı işlemleri isim ile yapmamız gerektiğinden 2 tane metod tanımlayarak bu sınıftaki işimizi bitiriyoruz.
  • İlki "findByName()" adından da anlaşılacağı gibi aranan nesneyi parametre olarak geçen isim ile arama metodudur.
  • İkincisi  "deleteByName" aranan nesneyi parametre olarak geçen isim ile bulup silmeye yarayan metoddur.
Önemli not :  Proje ağacında göründüğü gibi bu interface'i implement eden sınıf yok! Çünkü Spring bunu otomatik olarak bizim yerimize yapacaktır bizim uğraşmamıza gerek kalmıyor! 😎 Daha da güzeli interface'in içinde bizim eklemiş olduğumuz o iki metodunda içeriğini yazmadan Spring kendisi onların ne işe yaradığını anlayıp bizim kullanımımıza sunacaktır.Peki nasıl ? 
Spring tüm sorgularının başında "find" kelimesini kullanmaktadır (delete hariç) bu yüzden bizimde eklemek istediğimiz metodun ismini find ile başatırsak Spring kendi sorgu bankasında bizimkine denk geleni arayacaktır ve bulduğunda ise o sorgu gibi çalıştıracaktır.Daha fazla detay için bu siteyi ziyaret edebilirsiniz.

Servis  katmanı bittiğine göre şimdi sıra sayfaların kontrolünü sağlayabileceğimiz sınıfımızı oluşturmaya geldi.Sınıfımızın adı FilmsController.java olsun.

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.coder.web.rest.service.Film;
import com.coder.web.rest.service.FilmRepository;

@RestController
public class FilmsController {

 @Autowired
 private FilmRepository filmRepository;
 
 @GetMapping("/films")
 public List sayHello() {
  return filmRepository.findAll();
 }
 
 @GetMapping("/films/{id}")
 public Film getFilm(@PathVariable String id) {
  return filmRepository.findByName(id);
 }
 
 @PostMapping("/films")
 public void addFilm(@RequestBody Film film) {
  filmRepository.save(film);
 }
 
 @PutMapping("/films/{id}")
 public void updateFilm(@RequestBody Film theFilm, @PathVariable String id) {
  filmRepository.save(theFilm);
 }

 @DeleteMapping("films/{id}")
 public void deleteFilm(@PathVariable("id") String theId) {
  filmRepository.deleteByName(theId);
 }
}

Sınıfımızı oluşturduktan sonra yazmış olduğumuz kodları anlayalım : 


@Autowired ile servis katmanında oluşturduğumuz interfacemizi enjeckte ediyoruz.Ardından gelen metod tüm filmlerin sayfaya gönerileceği metoddur, bir sonraki ise url de gelen "id" numarasını @PathVariable annotasyonu ile alarak veri tabanında aratan metodu kullanıyoruz.Diğer metodları anlatma ihtiyacı duymadığımdan buradan direkt ApplicationStart.java sınıfımızda yapacağımız değişikliklere geçmek istiyorum.


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@SpringBootApplication
@ComponentScan(basePackages="com.coder.web.rest")
@EnableMongoRepositories(basePackages="com.coder.web.rest.service")
public class Application {

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

}

Bu sınıf hali hazırda oluşturduğumuz projenin içinde hazır olarak gelmektedir fakat biz projedeki sınıfları farklı paketlere böldüğümüz için Spring' bu sınıfların nerede bulunduğunu bildirmemiz gerekiyor, dolayısıyla
  1. @ComponentScan notasyonu ile Spring'e components için hangi paketleri araması gerektiğini bildiriyoruz.
  2. @EnableMongoRepositories notasyonu ile ise Mongorepository interface'ini hangi pakette kullandığımızın bilgisini veriyoruz.
İşte bu kadar. "Ama biz veri tabanı bağlantısı bilgilerini kodlamadık" dediğinizi duyar gibiyim 😁
Evet veri tabanı hakkında hiçbir kod yazmadık ve yazmamıza gerek yok! Nasıl mı? Bu aşamada da Spring yine bizim imdadımıza yetişip tüm veri tabanı işlemlerini kendisi üstlenmektedir. Bize kalan sadece projemize sağ tıklayıp "Run as -> Java application" demek oluyor.
Uygulama ayağa kalkarken konsolda uygulamanın hangi portta çalışacağı ve veri tabaının otomatikmen oluşturulduğu bilgisinin teyidini alabilirsiniz.

Hemen "Firefox, Chrome ya da Safari" artık siz browser olarak hangisini kullanıyorsanız  tarayıcınızı açıp localhost:konsolda yazan port numarası + /films  adresine gittiğinizde karşınıza veri tabanına eklemiş olduğunuz tüm film listesi JSON formatında görünecektir.

Not : Rest api mizi daha da hızlı test edebilmek amaçlı için POSTMAN uygulamasını indirmenizi tavsiye ediyorum.
Projenin tamamını buradan edinebilirsiniz.

Just trying to be Coder

Yorumlar

Bu blogdaki popüler yayınlar

HTML + CSS + JS ile basit hesap makinesi ve dijital saat yapımı.

Merhaba arkadaşlar, Bu yazıda çok basit kodlarla kısa bir sürede aşağıdaki resimde gördüğünüz gibi güzel görünümlü, web hesap makinesi ve dijital saatin nasıl yapılabileceğini göreceğiz. Sırasıyla Html sonra Css ardından Javascript kodlarımızı yazacağız. Bu şekilde ilerlemek istememin sebebi bu projeyi insan vucüduna benzetmemden kaynaklıdır. ilk önce iskeleti oluşturup sonra bu iskelete rengi ile etini, sonrada hareket edebilmesi için kaslarını ekleyeceğiz. Bu şekilde adım adım ilerlememiz işimizi dahada kolaylaştıracaktır. Hemen projemiz için bir klasör oluşturalım, içinede HTML, CSS, JS adında üç ayrı klasör daha oluşturalım böylelikle hem dosyalarımız birbirine karışmayacak hemde anlaşılması kolay bir proje olacak. İlk olarak iskeletimizi HTML ile oluşturalım :  Html için oluşturduğumuz klasörün içine "index" adında bir html dosyası oluşturuyoruz.Aşağıdaki gibi kodları kendi .html dosyamıza yazıyoruz. Ardından sıra geldi .css dosyamızı oluşturmaya