RestEasy İle Restful Web Servis Dersleri 5 – @Post,@Put,@Delete Notasyonları
Merhabalar arkadaşlar. Bu yazıda @Post, @Put ve @Delete notasyonlarının RestEasy ile Rest Web Service yazarken nasıl kullanılacağını öğreneceğiz. Kısaca notasyonlardan bahsedelim ama başlamadan önce bu yazının sonunda bir client tabanlı örnek yapacağız. Onun için bağımlılıklarınız arasına şunu ekleyin arkadaşlar:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.16.Final</version>
</dependency>
@Post Notasyonu
Önceki yazıda GET notasyonu ile işaretlediğimiz bir metotdan JSON tipinde çıktı almayı öğrenmiştik. Web Service içerisinde karşı tarafa veri yollamak için bizler POST notasyonu ile işaretlenmiş metodu kullanıyoruz. Az sonra göreceğimiz @Put notasyonu ile işaretlenmiş metot da karşı tarafa veri yollamak için kullanılır. Yalnız ikisi arasındaki fark veri ilk defa yollanacağı zaman işlemin Post ile yapılması, güncelleneceği zaman Put ile yapılmasıdır.
@Put Notasyonu
Put Notasyonu ile işaretlediğimiz bir metodu karşı tarafta bulunan veriyi güncellemek için kullanırız.
@Delete Notasyonu
Karşı taraftan veri silmek için metodu işaretlediğimiz notasyondur.
Örnek Kullanımlar
Şimdi bu 3 notasyon ile işaretlenmiş metotların bulunduğu bir web servis yazalım ve bir de Client oluşturarak bu web servisleri kullanalım.
AppConfig.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package restService;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
/**
*
* @author ilkaygunel
*/
@ApplicationPath("restService")
public class AppConfig extends Application{
}
@ApplicationPath notasyonu ile belirttiğimiz restService bizim web servislerimiz için kök yoldur.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package restService;
/**
*
* @author ilkaygunel
*/
public class Employee {
private int employeeId;
private String employeeName;
private String employeeSurname;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getEmployeeSurname() {
return employeeSurname;
}
public void setEmployeeSurname(String employeeSurname) {
this.employeeSurname = employeeSurname;
}
}
POJO sınıfımız niteliğindeki Employee sınıfımız.
Service.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package restService;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
/**
*
* @author ilkaygunel
*/
@Path("/service")
public class Service {
@POST
@Path("/addRecord")
@Consumes("application/json")
public void addRecord(Employee employee) {
Map<Integer, String> employeeMap = new HashMap<>();
employeeMap.put(employee.getEmployeeId(), employee.getEmployeeName()+" "+employee.getEmployeeSurname());
System.out.println("@POST ile işaretlenmiş metoda gelen veri:");
System.out.println(employee.getEmployeeId());
System.out.println(employee.getEmployeeName());
System.out.println(employee.getEmployeeSurname());
System.out.println("---HashMap İçindeki Veri (POST Metodundan)---");
for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) {
System.out.println(entry.getKey() +" " +entry.getValue());
}
}
@PUT
@Path("/updateRecord")
@Consumes("application/json")
public void updateRecord(Employee employee) {
Map<Integer, String> employeeMap = new HashMap<>();
System.out.println("@PUT ile işaretlenmiş metoda gelen veri:");
System.out.println(employee.getEmployeeId());
System.out.println(employee.getEmployeeName());
System.out.println(employee.getEmployeeSurname());
Employee addedEmployee = new Employee();
addedEmployee.setEmployeeId(1);
addedEmployee.setEmployeeName("Hasan");
addedEmployee.setEmployeeSurname("Kelleci");
employeeMap.put(addedEmployee.getEmployeeId(), addedEmployee.getEmployeeName()+" "+addedEmployee.getEmployeeSurname());
for(Integer key : employeeMap.keySet()) {
if(key ==employee.getEmployeeId())
{
employeeMap.put(key, employee.getEmployeeName()+" "+employee.getEmployeeSurname());
break;
}
}
System.out.println("---HashMap İçindeki Veri (PUT Metodundan)---");
for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) {
System.out.println(entry.getKey() +" " +entry.getValue());
}
}
@DELETE
@Path("/deleteRecord/{id}")
@Consumes("application/json")
public void deleteRecord(@PathParam("id") int id) {
Map<Integer, String> employeeMap = new HashMap<>();
Employee addedEmployee = new Employee();
addedEmployee.setEmployeeId(1);
addedEmployee.setEmployeeName("Adem");
addedEmployee.setEmployeeSurname("Kırbaş");
employeeMap.put(addedEmployee.getEmployeeId(), addedEmployee.getEmployeeName()+" "+addedEmployee.getEmployeeSurname());
for(Integer key : employeeMap.keySet()) {
if(key == id)
{
employeeMap.remove(key);
break;
}
}
if (employeeMap.isEmpty()) {
System.out.println("Liste Boş!");
}
else{
System.out.println("Liste Boş Değil!");
}
}
}
Service sınıfı istemcilerin kullanacağı web servis metotlarını barındıran sınıftır. Sınıf içerisinde
- istemcilerin sisteme veri gireceği @POST ile işaretlenmiş addRecord metodu,
- istemcilerin sistemdeki veriyi güncelleyeceği @PUT ile işaretlenmiş updateRecord metodu,
- istemcilerin sistemden veri sileceği @DELETE ile işaretlenmiş deleteRecord metodu bulunmakta. addRecord metodu 3 notasyon ile işaretli. Bunlar @POST,@Path ve @Consumes. @Path notasyonunu önceki yazıdan biliyoruz. @POST bu metodun veri girmek için kullanılacağını simgeliyor. @Consumes metodu ise bu metoda hangi tipte veri geleceğini söyler. addRecord metoduna veriler JSON tipinde gelecek ve kendi mekanizması içerisinde bu JSON tipindeki veri Employee tipine çevirilecek. Metot içerisinde verilerin tutulduğu bir Map yer alıyor. Put metodu ile POST’dan gelen Employee verisi Map’e koyuluyor. Println’ler ile POST’tan gelen veriler ve HashMap’deki veriler konsola yazdırılıyor.
PUT ile işaretli metotda POST’dan farklı olarak HashMap içinde arama yapılıyor ve gelen verideki eşleşen ID’de güncelleme yapılıyor. Put metodu aynı zamanda güncelleme de yapar.
DELETE ile işaretli metotda ise üstteki 2 metotdan farklı olarak parametreyi URL üstünden alıyoruz. @Path notasyonuna parametre eklenmesinden de önceki yazıda biraz bahsetmiştik. Burada da gördüğümüz üzere @PathParam ile URL üzerinden gelen veriyi alıyoruz ve HashMap’den kaldırıyoruz.
İstemcilerin kullanacağı web servis tarafımız bu kadar arkadaşlar. Şimdi bir de istemci kodu yazalım.
ClientClass.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package restClient;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import restService.Employee;
/**
*
* @author ilkaygunel
*/
public class ClientClass {
public static void main(String[] args) {
ClientClass clientClass = new ClientClass();
clientClass.postMethod();
clientClass.putMethod();
clientClass.deleteMethod();
}
public void postMethod() {
System.out.println("---------------------");
String url="http://localhost:8084/RestEasyTutorials/restService/service/addRecord";
Employee employee = new Employee();
employee.setEmployeeId(1);
employee.setEmployeeName("Hasan");
employee.setEmployeeSurname("Kelleci");
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(url);
Response response = target
.request()
.post(Entity.entity(employee, "application/json"));
if(response.getStatus() == 200)
{
System.out.println("Veri Başarılı Bir Şekilde Gönderildi");
}
else
{
System.out.println("Veri Gönderimi Sırasında Hata Meydana Geldi!"+response.getStatus());
}
}
public void putMethod(){
System.out.println("---------------------");
String url="http://localhost:8084/RestEasyTutorials/restService/service/updateRecord";
Employee employee = new Employee();
employee.setEmployeeId(1);
employee.setEmployeeName("Adem");
employee.setEmployeeSurname("Kırbaş");
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(url);
Response response = target
.request()
.put(Entity.entity(employee, "application/json"));
if(response.getStatus() == 200)
{
System.out.println("Veri Başarılı Bir Şekilde Gönderildi");
}
else
{
System.out.println("Veri Gönderimi Sırasında Hata Meydana Geldi!"+response.getStatus());
}
}
public void deleteMethod(){
System.out.println("---------------------");
String url="http://localhost:8084/RestEasyTutorials/restService/service/deleteRecord";
url = url + "/1";
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(url);
Response response = target
.request()
.delete();
if(response.getStatus() == 200)
{
System.out.println("Veri Başarılı Bir Şekilde Gönderildi");
}
else
{
System.out.println("Veri Gönderimi Sırasında Hata Meydana Geldi!"+response.getStatus());
}
}
}
ClientClass sınıfımız içerisinde her işlem için ayrı birer metot yer almakta.
postMethod içerisinde web servisi kullanma isteğinde bulunacağımız bir url nesnesi tanımlıyoruz. Akabinde karşıya gönderilecek bir Employee nesnesi oluşturup ona atamalar yapıyoruz. Bundan sonra olayın asıl noktasına geliyoruz. İstekte bulunacak bir client nesnesi oluşturuyoruz.
ResteasyClient client = new ResteasyClientBuilder().build();
Bu satır ile biz kullandığımız RestEasy kütüphanesinden bir client elde etmiş oluyoruz.
ResteasyWebTarget target = client.target(url);
Bu satır ile client’ın nereye istekte bulanacağını söylüyoruz. postMethod için burası …/restService/service/addRecord olacaktır.
Response response = target
.request()
.post(Entity.entity(employee, "application/json"));
Bu satırlar ile yukarıda tanımladığımız target’a bir request yapıyoruz ve ilgili request’i post kullanarak yapıyoruz. Entity.entity(employee, “application/json”) ifadesinde birinci parametre karşıya ileteceğimiz veri, ikinci parametre verinin hangi veri tipine çevirilip gönderileceğidir. Veri ilerimini Rest API içerisinde bir yapı olan Entity ile yapıyoruz. Son olarak if-else bloğu ile request’den ne döndüğüne ve dönen HTTP koduna bakıyoruz. HTTP 200 kodu Okey manasındadır ve bir sorun olmadığını bildirir. Bunun için kontrolümüzü 200 kodunu baz alarak yapıyoruz.
updateRecord metodu da addRecord ile aynıdır. Sadece request’imizi post yerine put ile yapıyoruz.
deleteRecord metounda ise farklı olarak elimizdeki url’e bir parametre eklemesi yapıyoruz ve üstteki metotlar gibi request metoduna parametre vermek yerine direk delete() şeklinde çağırıyoruz. Metot içerisinde 1 kayıt ekli olduğu ve silmenin de 1 kaydı etkilemesinden ötürü metot sonunda listenin boş olup olmadığına bakıyoruz.
Konsol Çıktısı
[]
Konsol çıktısında gördüğümüz üzere işlemler başarılı bir şekilde yapıldı.
Bu yazıda bu kadar arkadaşlar. @Post, @Put ve @Delete notasyonlarının kullanımı öğrenmiş olduk bu yazı ile. Gelecek yazıda görüşene kadar sağlıcakla kalın.
12 Nisan 2016 – Ekleme
Alican Akkuş Service sınıfı üzerinde bazı düzenleme&geliştirmeler yaparak kodu paylaştı. Ben de kendisine teşekkür ederek kodunu burada paylaşıyorum.
Paste2
Create Paste
Followup Paste
QR
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package restService;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
/**
*
* @author ilkaygunel
*/
@Path("/service")
public class Service {
static Map<Integer, String> employeeMap = new HashMap<>();
static{
employeeMap.put(1, "alican akkus");
employeeMap.put(2, "ilkay dogan");
employeeMap.put(3, "mustafa");
}
@POST
@Path("/addRecord")
@Consumes("application/json")
public void addRecord(Employee employee) {
if(!employeeMap.containsKey(employee.getEmployeeId())){
employeeMap.put(employee.getEmployeeId(), employee.getEmployeeName()+" "+employee.getEmployeeSurname());
}else{
//throw rte(employee has already added!)
}
System.out.println("@POST ile işaretlenmiş metoda gelen veri:");
System.out.println(employee.getEmployeeId());
System.out.println(employee.getEmployeeName());
System.out.println(employee.getEmployeeSurname());
System.out.println("---HashMap İçindeki Veri (POST Metodundan)---");
for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) {
System.out.println(entry.getKey() +" " +entry.getValue());
}
}
@PUT
@Path("/updateRecord")
@Consumes("application/json")
public void updateRecord(Employee employee) {
System.out.println("@PUT ile işaretlenmiş metoda gelen veri:");
System.out.println(employee.getEmployeeId());
System.out.println(employee.getEmployeeName());
System.out.println(employee.getEmployeeSurname());
if(!employeeMap.containsKey(employee.getEmployeeId())){
employeeMap.put(employee.getEmployeeId(), addedEmployee.getEmployeeName()+" "+addedEmployee.getEmployeeSurname());
}else{
//throw rte(employee not found!)
}
System.out.println("---HashMap İçindeki Veri (PUT Metodundan)---");
for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) {
System.out.println(entry.getKey() +" " +entry.getValue());
}
}
@DELETE
@Path("/deleteRecord/{id}")
@Consumes("application/json")
public void deleteRecord(@PathParam("id") int id) {
if(!employeeMap.containsKey(employee.getEmployeeId())){
employeeMap.remove(employee.getEmployeeId()))
}else{
//throw rte(employee not found!)
}
if (employeeMap.isEmpty()) {
System.out.println("Liste Boş!");
}
else{
System.out.println("Liste Boş Değil!");
}
}
}
© 2006 - 2016 Paste2.org.
Follow paste2.org on Twitter
RestEasy İle Restful Web Servis 1-Giriş, Web Servis Nedir?
RestEasy İle Restful Web Servis 2-RestEasy Kullanımı İçin Hazırlık
RestEasy İle Restful Web Servis 3-Resteasy Servlet Initializer
RestEasy İle Restful Web Servis 4 – @Path Ve @GET Notasyonları
Paypal Hesabım:https://www.paypal.me/ilkaygunel
Hakkımda Sayfam:http://kod5.org/ilkaygunel-hakkimda/