Bu yazıda sizlere kendimi geliştirme amaçlı yapmış olduğum bir proje olan MemberRestAPI projesinin kullanımını anlatacağım. Projenin kaynak kodlarına https://github.com/ilkgunel/MemberRestAPIProject adresinden erişip istediğiniz gibi kullanabilirsiniz.

Projede kullandığım kütüphaneler şöyle:

  • Minimum konfigürasyon sağlayan Spring Boot
  • Restful servisler sunmak için Spring Rest
  • Erişim kısıtlamaları için Spring Security
  • Veritabanı bağlantılarını yönetmek için Spring Data
  • Veritabanı yazılımı olarak MySQL
  • E-mail gönderimi için Spring Mail

Proje temel olarak bir CRUD projesi arkadaşlar. Restful web servis endpoint’lerine kayıt, getirme, güncelleme ve silme işlemleri için JSON formatında request’ler gönderiliyor ve geri cevap olarak da JSON formatında cevaplar alınıyor. Getirme servisi dışındaki tüm servisler Spring Security tarafından korunmuş web servislerdir. Sisteme kayıtlı olmayan, kayıtlı olsa bile erişim hakkı olmayan, erişim hakkı olacak şekilde kaydolmuş olsa bile hesabı aktifleştirilmemiş kullanıcılar kaydetme, güncelleme ve silme servislerine erişemezler. Testler için proje ayağa kalkarken ADMIN rolündeki bir kullanıcıyı veritabanına kaydediyor. Resources klasörünün altında yer alana import.sql dosyası ile projenin ayağa kalkması sırasında veritabanına atılacak kayıtları tanımlayabiliyoruz.

Projede 2 adet rol var. Birisi USER ve birisi de ADMIN rolü. ADMIN rolü USER’a ait path’lere erişim sağlayabiliyorken USER rolü ADMIN’e ait path’lere erişim sağlayamıyor.

Projeyi sizin de ayağa kaldırmanız için yapmanız gereken tek şey var. MySQL database içerisinde MemberRestAPIProject adında bir veritabanı oluşturmanız projeyi ayağa kaldırmak için yeterli. Veritabanı tanımının ardından Application.java sınıfını çalıştırdığınızda proje ayağa kalkacaktır.

Şimdi projedeki CRUD işlemlerini gerçekleştirelim. Ben bu yazı için PostMan uygulaması ile Post işlemlerini gerçekleştireceğim.

1.Tekil Ve Çoğul User Ve Admin Üye Kayıt İşlemi

İlk olarak tekil USER rolünde bir üyenin kaydı için PostMan’in arayüzünden POST işlemi yapılacağını söyleyip adres olarak http://localhost:8080/MemberRestAPIProject/memberPostWebServiceEndPoint/saveUserMember linkini veriyorum. Akabinde Authorization kısmından Basic Auth’u seçiyoruz ve UserName&Password alanına ilkgunel93@gmail.com ve TEST 1234 bilgilerini giriyoruz.

Body kısmına da raw ve JSON seçip aşağıdaki JSON datasını yapıştırıyoruz ve Send butonuna tıklıyoruz.

{
	"memberList":
	[
		{"firstName": "Michael","lastName": "Schumacher","memberLanguageCode":"tr","email":"ilkay.gunel@kod5.org","password":"TEST1234"}
	]
	
}

JSON datası içerisinde memberList key’inde veri gönderiyorum. JSR-303 sebebi ile @Valid notasyonu List nesnesi üzerinde validasyon yapamıyor, tekil bean’ler üzerinde validasyon yapabiliyor. Ben de web servis endpoint’inde List tipinde veri almak yerine bir MemberWrapper yazdım ve validasyonun ardından memberList'i kullandım.

package com.ilkaygunel.wrapper;

import com.ilkaygunel.entities.Member;

import javax.validation.Valid;
import java.util.List;

public class MemberWrapper {

    @Valid
    private List<Member> memberList;

    public List<Member> getMemberList() {
        return memberList;
    }

    public void setMemberList(List<Member> memberList) {
        this.memberList = memberList;
    }
}

Ayrıca kod kalitesini artırmak ve kod tekrarını azaltmak için bir üye için de işlem yapılmak istense 5 üye için de işlem yapılmak istense ben web servisimde MemberWrapper üzerinden List olarak karşılıyorum ve o şekilde işleme sokuyorum.

Response alanında göreceğimiz gibi üye kayıt işlemi başarı ile tamamlandı. Kullanıcı hesabının aktifliğini bildiren enabled alanı false olarak kaydedildi.

Şimdi hiçbir şey yapmadan PostMan üzerindeki Authorization kısmında geri dönüyorum ve username alanını az önce kaydettiğim üyenin e-posta adresi olan ilkay.gunel@kod5.org ile değiştiriyorum ve Preview Request butonuna tıklıyorum. Akabinde tekrar Send butonuna tıklıyorum.

Gördüğünüz gibi bana 401 kimlik doğrulama hatası döndü ve hata mesajında User is disabled metni gönderildi. Henüz aktifleştirilmemiş kullanıcıların işlem gerçekleştiremeyeceğini görmüş oluyoruz böylece.

ilkay.gunel@kod5.org e-posta hesabımı kontrol ettiğimde hesabımın aktifleştirilmesine dair bir mail geldiğini görüyorum. Bu mail’deki url’i alıp tarayıcıdaki adres çubuğuna kopyaladığımda ise hesabın aktifleştirildiğine dair mesaj alıyorum.

Şimdi Body alanındaki JSON’daki e-mail alanını herhangi bir e-mail adresi ile değiştiriyorum. Ben burada ilkay_gunel34@hotmail.com’u kullanacağım. Akabinde de Send butonuna tıklıyorum. Az önce kullanıcı aktif olmadığı için engellene istek şimdi başarı ile tamamlanıyor.

Şimdi son olarak da POST isteğinin yapıldığı Path’in sonunu saveAdminMember olarak değiştirp aynı request’i tekrar gönderiyorum. Şimdi de erişim hakkım olmayan bir yere erişim denediğim için 403 yetki hatası döndü ve hata mesajında Access is denied metni geldi.

Toplu halde üye kaydetmek istediğimde de saveUserMember adresine göndereceğim JSON datası şu şekilde olacaktır:

{
	"memberList":
		[
                 	{"firstName":   				"Mika","lastName":"Hakkinen","memberLanguageCode":"tr","email":"ilkay.gunel@kod5.org","password":"TEST1234"},
                 	{"firstName": "David","lastName": 					"Coulthard","memberLanguageCode":"en","email":"ilkay_gunel34@hotmail.com","password":"TEST1234"}
                 ]
} 

Bana dönen mesaj da şöyle:

2.Tekil ve Çoğul Üye Güncelleme İşlemi

Üye güncelleme işlemi için http://localhost:8080/MemberRestAPIProject/memberUpdateWebServiceEndpoint/updateUserMember http://localhost:8080/MemberRestAPIProject/memberUpdateWebServiceEndpoint/updateAdminMember adreslerini kullanıyoruz. Burada işlem tipinin artık POST değil PUT olduğunu belirtmekte fayda var.

Şimdi az önce USER rolünde kaydettiğim ve id bilgisi 2 olan (bir üst resimdeki sonuç mesajında yer alıyor) Mika Hakkinen’i updateUserMember path’ine istek gönderip Rubens Barichello olarak güncelleyeceğim. JSON aşağıdaki gibi olacaktır. Yine memberList key’inde bir JSON array gönderiyoruz çünkü üye güncelleme web servis endpoint’i de bir liste isteği karşılayacak.

{
	"memberList":
			[
                {"id":2,"firstName": "Rubesn","lastName": "Barichello","memberLanguageCode":"tr"}
            ]
}

Dönen cevapta işlemin başarı ile gerçekleştiği söyleniyor.

Birden fazla üye güncellenmek istendiğinde de JSON’da gönderilen üye bilgileri arttıralarak işlem yapılabilir.

3.Member Listeleme İşlemi

Browser üzerinden http://localhost:8080/MemberRestAPIProject/memberGetWebServiceEndPoint/getAllMembers adresine gitmeye çalıştığımda bu bir GET isteği olacaktır ve bana o an kayıtlı tüm üyelerin listesini sunacaktır.

Ayrıca FirstName bilgisi ile istenen bir üyenin de bilgileri getirebilir. Bu işlem için getMemberViaFirstName path’i kullanılmalı ve Query Param olarak firstName parametresi geçirilmelidir. Tam adres şöyle: http://localhost:8080/MemberRestAPIProject/memberGetWebServiceEndPoint/getMemberViaFirstName?firstName=hangiİsmiİstiyorsanızOGelecek.

Ben ilkay ismindeki kullanıcıyı getirmek istiyorum.

Bir de istenen kullanıcıyı id bilgisine getirebiliriz. Bunun için de getMemberViaId/idBilgisi şeklinde istek atmamız gerekiyor. Örneğin id’si 2 olan kullanıcıyı getirmek için http://localhost:8080/MemberRestAPIProject/memberGetWebServiceEndPoint/getMemberViaId/2 adresini kullanacağız.

4.Üye Silme İşlemi

Üye silme işlemi için ise http://localhost:8080/MemberRestAPIProject/memberDeleteWebServiceEndPoint/deleteUserMember http://localhost:8080/MemberRestAPIProject/memberDeleteWebServiceEndPoint/deleteAdminMember adreslerini kullanıyoruz. Üye silme işleminde kayıt ve güncelleme işlemlerinden farklı olarak memberList kullanmıyoruz ve HTTP metodunu DELETE olarak gönderiyoruz fakat yine JSON array gönderiyoruz. Web service tarafı bu işlem için de liste karşılaması yapıyor. Üye silme işleminde sadece id bilgisinin gönderilmesi yeterli. Örneğin 2 id bilgisindeki USER rolündeki kullanıcıyı silmek için oldukça basit olan JSON datamız şöyle olur:

[{"id": 2}]

Bu isteği attığım zaman bana şu şekilde işlemin başarılı olduğuna dair bir mesaj dönüyor.

Birden fazla üyeyi aynı anda silmek istersem de JSON datası şu şekilde olmalı:

[
	{"id": 2},
	{"id": 3},
	{"id": 4}
]

Bu yazıda anlatacağım bu kadar arkadaşlar. Projenin nasıl ayağa kaldırılıp neler yapılabileceğin bahsettim. Projeye çalıştırma aşamasında sorun yaşarsanız ya da kod içerisinde anlamadığınız yerler olursa yorum kısmına yazarak bana sorabilirsiniz aradaşlar.

Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle