Merhaba değerli Java dostları,
Bu yazımda yeni bir kategori olan Rest servis hakkında yazmak istiyorum. Öncelikle Rest servislerin popüler olmasının nedenleri, avantajları, dezavantajları gibi konulara hiç girmek istemiyorum. Bu konuyu merak eden arkadaşlarımız buradaki linkten detayları öğrenebilirler. Detaylara girmek istemeyeşimin nedeni bazı konuları buraya uzun uzadıya yazarak sizleri boğmak istemiyorum, bundan dolayı direkt örnek kodumuza geçiyorum.
Öncelikle iki projemiz olduğunu belirteyim. Rest bir web servis olduğu için olayın bir server bir de client tarafı olduğunu belirteyim. Önce server tarafı. Örnek kodlarımzda basit bir veri işleme servisi sunuyoruz. Önce bean sınıfı.
package anajavatica.rest.controller;
import java.io.Serializable; public class Developer implements Serializable { private static final long serialVersionUID = 1L; public Developer(String name, String language) { public String getName() { public String getLanguage() { public void setName(String name) { public void setLanguage(String language) { @Override } |
Şimdi de verileri işleyen controller sınıfı. Bu sınıfı gerçekten veritabanı üzerinde çalışan veya veri üreten, işleyen bir sınıf olarakda düşünebiliriz.
package anajavatica.rest.controller;
import java.util.ArrayList; public class RestServiceController { private List developerList = new ArrayList<>(); public List getDeveloperList() { public Developer getDeveloper(String name, String language) { public boolean addDeveloper(Developer developer) { public boolean updateDeveloper(Developer developer) { } |
Controller sınıfı üzerinde tamamen önyüzden bağımsız olarak çalışıyoruz. Böylece tarın rest yerine başka bir haberleşme şekli kullandığımızda kolaylıkla adapte edebileceğiz. Şimdi de rest servisi sağlayan sınıfımız.
package anajavatica.rest;
import javax.ws.rs.Consumes; import anajavatica.rest.controller.Developer; @Produces(MediaType.APPLICATION_JSON) private RestServiceController controller = new RestServiceController(); @GET @GET @POST @PUT private RestServiceController getController() { } |
Şimdi biraz detaya dalma zamanı. @Produces ve @Consumes annotationları ile bu sınıfın hangi tipte veri kabul ettiğini ve hangi tipte veri döndürdüğünü belirtiyoruz. Biz burada JSON formatı üzerinden ilerliyoruz. Envai çeşit tipten birisini seçebilirsiniz. @Path ile mevcut URI’ ye ek olarak hangi yolun ekleneceğini belirtiyoruz. Böylece bu sınıfa daha doğrusu bu sınıfın sunduğu servise ulaşmak için hangi pathin kullanılacağı ortaya çıkıyor. @GET, klasik HTTP GET işleminin karşılığını veriyor. getDeveloper metodu da @GET yöntemi ile çalışıyor; fakat getAllDevelopers metodundan farklı olarak bir @PATH alıyor ve iki tane de @PathParam alıyor. Böylece URI üzerinden göndereceğimiz değerler parametre olarak okunabiliyor. @POST ve @PUT metotları yine klasik HTTP POST ve HTTP PUT metotlarına karşılık geliyor.
Aslında rest servisin Java kodu tarafında gerekli tüm işlemleri yerine getirdik; ama siz buradaki kodları olduğu gibi kullandığınızda muhtemelen hatalar alacaksınız. Bazı kütüphaneleri indirmeniz gerekiyor. Ben bu örneği yaparken maven kullandım ve aşağıdaki kütüphaneleri indirdim.
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</version> </dependency><dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.22.2</version> </dependency><dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.22.2</version> </dependency> |
Bunun yanı sıra web.xml üzerinde de bazı eklemeler yapmamız lazım.
<servlet> <servlet-name>Jersey RESTful Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>anajavatica.rest</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Jersey RESTful Application</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> |
Böylece örneğimizin server tarafı tamamlanmış oldu. Şimdi sıra geldi client tarafına. Önce gerekli kütüphanelere bakalım.
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</version> </dependency><dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.22.2</version> </dependency> <dependency> |
Şimdi de rest servisleri çağıracak client main sınıfımız.
import java.net.MalformedURLException;
import javax.ws.rs.client.Client; import anajavatica.rest.controller.Developer; public class RestServiceClient { private Client buildClient() { public void addDeveloper() throws MalformedURLException { public void updateDeveloper() throws MalformedURLException { public void getAllDevelopers() throws MalformedURLException { public void getDeveloper() throws MalformedURLException { public static void main(String[] args) throws MalformedURLException { RestServiceClient restClient = new RestServiceClient(); } } |
Burada her rest servis metoduna karşılık bir client metodu oluşturduk. Bazı önemli noktalar şunlar; hangi URI kullanılacak, request tipi, post, put, get metotları ve dönüş değerleri.
Umarım yeni kategorimin ilk yazısı biraz da olsa faydalı olmuştur.
Bol Java’ lı günler dileğiyle… 🙂
No responses yet