30 Haziran 2015 Salı

REST With Java (JAX-RS) -Jersey Kullanımı


Bu yazımda bir Jersey implementationu olan JAX-RS ile RESTful webservislerinin nasıl geliştirildiğinden bahsedeceğim.

Rest(Representational State Transfer) : REST , SOAP gibi bir servisdir.REST in SOAP dan en önemli farkı XML ve JSON formatı ile mesaj yollayıp geri alıyor olabilmesidir.REST , HTTP protokolü üzerinden GET,POST,PUT veya DELETE komutlarını kullanarak isteklerini bildirir.Şimdi bu komutlara bir göz atalım.

GET : Sunucuda bulunan kaynağı(resource) almak için kullanılır.Bu metod ile resource değişmez.Bir nevi select görevi görür.

POST : Yeni bir kaynak(resource) oluşturmaya yarar.Bir nevi insert görevi görür.

PUT : Mevcut bir kaynağı değiştirmek-güncellemek için kullanılır.Bir nevi update görevi görür.

DELETE : Mevcut bir kaynağı silmek için kullanılır.

Java da Jersey ileJAX-RS Kullanımı

Java'nın REST desteği JSR (Java Spesification Request) 311 aracılığıyla olur. İşte bu JSR 311 özelliği JAX-RS(Java API for RESTful Web Services) diye bilinir.

Jersey : Jersey bir JSR 311 implementationudur.Bu implementation Restful web servisleri için bir kütüphane sağlar.
Jersey hem server hem de client tarafında iletişim kurmamızı sağlar. URL aşağda ki gibidir;

      
http://your_domain:port/display-name/url-pattern/path_from_rest_class


Bu servlet gelen HTTP requestlerini analiz eder ve bunlara uygun bir response için uygun classı seçer.
JAX-RS , JAXB ' ye alternatif olarak JSON ve XML formatlarının ikisini de destekler.

@Produces(MediaType.TEXT_PLAIN[, more-types]) : Mime türünün belirlememize yarar.Gelen data GET metodu ile alınan datadır.Bu tür ayrıca “application/xml” ya da “application/json” da olabilir.Yanda ki kısımda “text/plain” örnek olarak kullanılmıştır.
@Consumes(type[, more-types]) : Alınan kaynağın mime type ını belirlemek için kullanırız.

@PATH(your_path) : URL + /your_path.Aşağıda ki örnek gibidir.

 http://your_domain:port/display-name/url-pattern/path_from_rest_class


Jersey kütüphanelerini buradan indirebilirsiniz.


Aşağıda ki örnekler Jersey kullanarak XML ve Json formatında RestFul webservis yazılışını göstermektedir.

 Java classlarımızı yazmaya başlamadan önce açtığımız Dynamic Web Projesinde ki web.xml dosyamıza aşağıda ki gibi eklemeler yapmamız lazım.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>KutuphaneOtomasyonu</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet- class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mesutemre.kitaplarJAXRS</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


KitaplarRestModel.java

@XmlRootElement(name = "kitap")
public class KitaplarRestModel {

private Integer kitapID;
private String kitapad;
private String yazarad;
private String kitaptur;
private String kitapdurum;

public Integer getKitapID() {
   return kitapID;
}

public void setKitapID(Integer kitapID) {
   this.kitapID = kitapID;
}

public String getKitapad() {
   return kitapad;
}

public void setKitapad(String kitapad) {
   this.kitapad = kitapad;
}

public String getYazarad() {
   return yazarad;
}

public void setYazarad(String yazarad) {
   this.yazarad = yazarad;
}

public String getKitaptur() {
   return kitaptur;
}

public void setKitaptur(String kitaptur) {
   this.kitaptur = kitaptur;
}

public String getKitapdurum() {
   return kitapdurum;
}

public void setKitapdurum(String kitapdurum) {
   this.kitapdurum = kitapdurum;
}
}

Yukarıda yazdığımız POJO , XML ve JSON elde etmek için kullanacağımız POJO dur.

Artık Resource dosyalarımızı yazabiliriz.


KitaplarRestResource.java


@Path("/kitaplar")
public class KitaplarRestResource {

@GET
@Produces(MediaType.TEXT_XML)
public List<KitaplarRestModel> getKitaplarBrowser() {
   return findAllBooks();
}

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public List<KitaplarRestModel> getKitaplar() {
   return findAllBooks();
}

@GET
@Path("kitapsayisi")
@Produces(MediaType.TEXT_PLAIN)
public String getCount() {
   return String.valueOf(findAllBooks().size());
}

private List<KitaplarRestModel> findAllBooks() {
List<KitaplarRestModel> kitapRestList = new ArrayList<KitaplarRestModel>();
List<Kitaplar> kitapList = new ArrayList<Kitaplar>();
try {
    KitaplarFacade service = (KitaplarFacade) new InitialContext()
     .lookup("kitapservice");
    kitapList = service.findAllKitaplar();
    for (int i = 0; i < kitapList.size(); i++) {
        KitaplarRestModel krm = new KitaplarRestModel();
        krm.setKitapID(kitapList.get(i).getKitapID());
        krm.setKitapad(kitapList.get(i).getKitapad());
        krm.setYazarad(kitapList.get(i).getYazarad());
        krm.setKitaptur(kitapList.get(i).getKitaptur());
        krm.setKitapdurum(kitapList.get(i).getKitapdurum());

        kitapRestList.add(krm);
     }
  } catch (Exception e) {
      e.printStackTrace();
  }
   return kitapRestList;
 }
}

Burada findAllBooks() metodu ile DB deki kitap listesini çekiyoruz.Çektikten sonra kendi POJO typında bir List dolduruyoruz.


Yukarda ki URL'i tarayıcımıza yapıştırdığımız zaman bize XML formatında bir sayfa açacaktır.





<kitaplarRestModels>
   <kitap>
     <kitapID>12</kitapID>
     <kitapad>Java Server Pages</kitapad>
     <kitapdurum>Rafta</kitapdurum>
     <kitaptur>Bilgisayar</kitaptur>
     <yazarad>Mimar ASLAN</yazarad>
</kitap>

....


JSON formatında bir servis elde etmek için resource classımız aşağıda ki gibi olur.

KitaplarRestResourceJSON.java

@Path("/kitaplarjson")
public class KitaplarRestResourceJSON {

@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public List<KitaplarRestModel> getKitaplarJson() {
   return findAllBooks(); 
  }
}

http://localhost:9090/KutuphaneOtomasyonu/rest/kitaplarjson

Yukarıda ki URL ise bize JSON formatında kitap listemizi gösterir.