JAX-RS PROJE-1 (KAN BAĞIŞI)

          Bu yazımızda daha önce öğrendiğimiz ek açıklamaları kullanarak JSF-MySQL ile yazdığımız bir projeye RESTful web servisi yazacağız.Öncelikle projemizden bahsedelim.Projemizin adı kan bağışı.Kan bağışlamak isteyen gönüllü insanlar,bilgilerini sisteme bırakıyorlar.Kan ihtiyacı olan insanlar ise bu insanları bulup onlarla iletişime geçiyor.Yazacağımız servis sayesinde bu uygulamamızı isteyen herkes çok rahat bir şekilde kullanacak(Hastaneler,bağışçılara ihtiyacı olanlar,bağışçı eklemek isteyenler).Ben bu servisi yazarken sql sorgularıyla uğraşarak size hibernate,jpa gibi teknolojileri bilmezseniz ne kadar zorlanacağınızı göstermek için yazacağım. :) Şaka bir yana ben en kısa zamanda ORM araçlarını öğrenmeye başlayacağım.Kan arayan insanlar için GET metodu ile belirli kriterlere göre veya tüm bağışçıları getirtecek,POST metodu ile bağışçılar sisteme kaydolabilecek.Burada öğrendiğimiz diğer açıklamalarıda kullanacağız.Sırasıyla neler yaptığımıza bakalım.Öncelikle projenin bitmediğini belirtmek istiyorum.Her boş zamanımda eklemeler yapacağım.


Kodlarımız gördüğünüz gibi.Öncelikle bu kodlar arasında bloğumuzda bulunmayan Jackson var.Jackson kullanarak Java object <-> JSON dönüşümü yaptık.Daha sonra dataservice kısmında sql sorgularımızı çalıştırdık.Projemiz basit olmasına rağmen önemli birkaç eksiği bulunuyor.Bunlardan bir taneside response mesajları.Çünkü herhangi bir sql exception'ini bile ne tür bir response mesajı olacağına karar vermemişiz.Bir dipnot düşmek istiyorum.Siz siz olun exception'larınızı kullanıcıya göstermeyin. :) Bu projeyi arasıra güncelleyeceğim.SAĞLICAKLA KALIN.

HTTPCLIENT4-GİRİŞ

      Herkese merhaba.Bu yazımızda http client'a giriş yapacağız.HTTP CLIENT ile istek mesajlarımızı çok rahat bir şekilde oluşturacak, get,post,put,delete  metodlarını çok rahat bir şekilde kullanacağız.Bununla birlikte http response mesajlarının kontrolü olsun cookie işlemleri olsun vb. daha birsürü hazine keşfedilmeye hazır bir şekilde bekliyor :).İlk yazımıza basit bir örnek ile başlayalım.Şimdi tüm bağışçıları getiren küçük bir web servisi yazıp httpclient ile test edelim.Get metodu ile yapılan istekte http statusCode'u ekrana basalım.



  Daha önce aynı işi yapan bir client yazdığımızda hedef adresi beliryor Client nesnesi oluşturuyor ve hedef üzerinde bazı fonksiyonları çağırıyorduk.httpclient işimizi bayağı kolaylaştırıyor.Daha yeni başladık :)İşimize yarayacak birsürü şey öğreneceğimize inanıyorum.Bu konu ile ilgili yazılarımı paylaşırken RESTful web servislerini öğrenmeye devam edeceğiz.Birbirlerine yakın konular olduğu için birlikte götürmeyi düşünüyorum.




 -------------------------------BAĞIMLILIK-------------------------
<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
 </dependency>



JAX-RS (ENTITY PARAMETERS)

       Bu yazımızda post veya put ek açıklamalarını kullanmak için yazacağımız istemci api'sinde Entity sınıfımızı kullanarak XML,JSON veya düz yazı formatındaki verilerimiz post edeceğiz.Kodlarımızın yardımı ile konuyu çok daha iyi anlayacağız.Hadi başlayalım.





 Bağımlılıkları eklemeyi unutursanız çok sinir bozucu bir hata ile karşılaşırsınız.Aslında ne kadar çok hata ile karşılaşırsanız o kadar iyi öğrenirsiniz.

İYİ ÇALIŞMALAR...

JAX-RS (RESOURCE CONSTRUCTOR)

     Bu yazımızda daha önce gördüğümüz,verileri kullanıcıdan parametre olarak almamıza yarayan @HeaderParam,@CookieParam gibi açıklamaları kaynak class'ımızın yapıcı(constructor) fonksiyonundan alacağız.Kodlar üzerinden devam edelim.Aşağıda gördüğümüz üzere MyResource sınıfımızın yapıcı fonksiyonu global olarak tanımlı değikenlere parametre olarak gelen değişkenleri atıp,handleRequest fonksiyonundan bu değerlere ulaşıyor.Şimdi de yazdığımız kaynak sınıfını client sınıfımız ile kontrol edelim.

Aynı şekilde kurala uygun bir istek yaptığımızda çıktımız yandaki gibi olacaktır.
 Buraya kadar olan yazılarımı gözden geçirip hatalarımı düzeltip güncelleyeceğim.Kodlarımı yazdığım bilgisayarım çok eski olduğundan biraz ağır ilerliyoruz.Kısmet olursa bu hafta bilgisayarımı yenileceğim.Daha sonra  yazılarımızın sayısı hızla artacak.JAX-RS'i bitirip.HttpClient,mikroservisler gibi konular ile devam edeceğiz.Bu arada yetişirse bu yaz'ın sonuna kadar hibernate,jpa,spring mvc gibi JAVA EE teknolojilerini birlikte öğrenip çok iyi projeler geliştireceğiz.Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın.

JAX-RS (SINGLETON RESOURCES)

        Bu yazımızda ApplicationConfig sınıfımızda extends ettiğimiz,Application classında bulunan getSingletons() metodunu override ederek neler yapabileceğimizi inceleyeceğiz.Servisimiz her http isteğinde kaynakları tekrar tekrar oluşturur.Bu varsayılan çalışma şeklidir.Bildiğiniz üzere bazı fonksiyonları (static,final gibi.Bunlar override edilemez) override ederek geçersiz kılıp ihtiyacımıza bağlı olarak değiştirebiliriz.Bu yazımızda da bu kaynakların tekrar oluşmasını önlemek için getSingletons() fonksiyonunu override edeceğiz.Kodlarımızı görünce daha iyi anlayacağız.


Gördüğünüz üzere iki farklı kaynak sınıfımız ve ApplicationConfig  sınıfımız var.ApplicationConfig'te gördüğünüz set collection'ı,list'in bir benzeri olup verileri herhangi bir index ile tutmaz.İki fonksiyonumuzu override ettik.

counter1: 0
counter2: 10
Çıktımız bu şekilde olacaktır.Client classımızın yaptığı request mesajlarına karşılık ApplicationConfig class'ımızda ezdiğimiz fonksiyonlar :).<T> gelecek olan class'tan sonra şekil alacak.Bir sonraki yazımızda görüşmek üzere.


JAX-RS (COOKIES)

        Bu yazımızda çerezler ile çalışacağız.Çerez,herhangi bir İnternet sitesi tarafından bilgisayara bırakılan bir tür tanımlama dosyası. Çerez dosyalarında oturum bilgileri ve benzeri veriler saklanır.Yani,biz uygulamamız için bir çerez oluşturup bunu response mesajımıza ekleyeceğiz.Bu çerezlerde tarayıcılarda tutulacak.Daha sonra tarayıcıdan bir request mesajı daha gönderilecek olursa bu çerezlerde bu mesajın içinde yer alacak.Bu tekrar eden request istekleri için değişik şeyler yapılabilir.Örneğin siz bir sosyal medya uygulamasına giriş yaptınız.Daha sonra bu platformu kullanan bir uygulamayı kullanmak istediniz.Orada giriş bilgilerinizi tekrar girmenize gerek kalmaz.Bir başka örneğimiz bir bankanın internet bankacılık uygulamasından.Kendi hesabınıza girdikten sonra herhangi bir şekilde sayfanızı yenilediğinizde sizi otomatik olarak çıkışa yönlendiriyor.Şimdi bir cookie oluşturup bunu response mesajımıza ekleyelim.




Gördüğünüz gibi oluşturduğumuz çerezleri response mesajımıza ekleyip döndürdük.Yalnız dikkat edeceğimiz birkaç nokta var.Çerez adlarımızı belirlerken virgül,noktalı virgül ve boşluk kullanmamalıyız.Çünkü bu karakterleri kodlayacak bir standart mevcut değil.Bu çerezler http response mesajının başlık kısmında Set-Cookie başlığı altında tutulup farklı başlıklar altında sıralanıyor.Çıktı da gördüğünüz gibi.Peki bu çerezlere bir http isteği ile erişmeye çalışırsak nasıl olacak ?Bir de ona bakalım.Yukarıdaki çerezlerimizi birde request mesajı ile görüntüleyelim.


Şimdi de @CookieParam açıklamasını kullanarak bu çerezler üzerinde işlemler yapalım.Örneğin integer değer olarak gönderdiğimiz çerezi biz long olarak alabilir veya tarihi direct cookie tipinde alıp işleyebiliriz.Kodlarımıza göz atalım.





Son olarak bu çerezleri bir list aracılığıyla okuyalım.


Yazılarımda konuşma dili kullanığım için anlamsız cümleler kurmuş olabilirim.Anlamadığınız yeri yorum kısmından sorabilirsiniz.Konuyu çok iyi bir şekilde öğrendiğimi düşündüğümde videolu anlatım yapmayı düşünüyorum.Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın :)




JAX-RS (REQUEST & RESPONSE HEADERS)

     Herkese merhaba.Bu yazımızda http request ve response mesaj başlıkları üzerinde çalışcağız.Çeşitli kod örnekleri ile paketlerimizin yapısını iyice araştıracağız.Kodlarımızı parça parça yazıp yavaş yavaş anlayarak incelemeye çalışacağız.İşe httpheaders kullanarak tüm başlık mesajlarını çekerek başlayalım.Burada @Context ek açıklamasını kullanacağız.Şimdi de kodlarımıza bakıp,ayrıntılı bir şekilde inceleyelim.


  
@Context ve HttpHeaders kullanarak request mesajımızın başlık bilgilerini görüntüledik.Bunu yaparken key & value mantığında çalışan bir MultivaluedMap tanımladık.Daha sonra bu gelen başlık mesajlarını içine depoladık.Şimdide String str kısmına geldik.Sadece bir satır kodda javanın içinde kaybolup gidebileceğiniz kod parçalarından.Belki de üniversitemizde daha çok oop mantığı öğretildiği için java'nın stream api'sine bakacak fırsat bulamamışdır.Neyse bilmemek değil öğrenmemek ayıptır deyip yolumuza devam edelim :).Bu kod satırımızı sondan başlayarak inceleyelim.Collect tür dönüşümü yapan bir fonksiyon.Burada map bize Stream<> tipinde geri dönüş yapıyor ve bu değeri bir string atmaya çalıştığımız için bu dönüşüm yapılmış.Yani anlayacağınız kod'un sonuna +"" eklemekte bir çözüm.Map ise dönüşüm yapan bir fonksiyon,içerisinde ise lambda expressions kullandık.Lambda expression'ı geriye değer döndüren kod satırı diye düşünübilirsiniz.Bir fonksiyon değil fakat belli parametreler alıp o parametreler ile ilgili değer döndürüyor.Burada aldığı e parametresinin key ve value'sunu döndürüyor.Lambda expression kullanırken bunun 1.8 ve sonrasıdaki source formatında geçerli olduğunu söyleyebilir.Bunu düzeltmek için projenizin properties sekmesinden sources'a gidin ve oradaki source format değerini 1.8 veya daha üstünde bir değere ayarlayın.Stream'e gelecek olursak map stream'in bir işlemi.Stream Api yığınsal veriler üzerinde daha kolay çalışabilmemiz için geliştirilmiş.Collection,diziler vb. gibi.Map gibi kullanabileceğimiz diğer işlemleri burada gördüğünüz siteden alıntı yaparak bir fotoğraf kullanmak istiyorum.Fotoğrafı şimdilik yükleceğim.Kaynakta belirttik.Linkedin üzerinden de yazı sahibinden izin alacağım.İzin vermezse hemen kaldırırız.Yazılarımda alıntı yaptığım yerlerin kaynaklarını belirtmeye çalışırım.Etik olanda bu zaten.Adam o kadar yazmış etmiş,neymiş kopyala yapıştır sonrada ben yaptım :).Öyle olmaz arkadaşlar kimsenin hakkını yemeyelim.Bu arada kodlarımızın buradan olduğunu neredeyse her yazımda belirtmeye çalıştım.Allah var çok iyi örneklendirmiş.Neyse devam edelim.

ve map'teki key & value'ler ile işlem yapabilmemiz için entrySet().Dediğimiz gibi daha sonra da stream ve ilgili metod.Tersten başlayarak değişik bir yorum kattığımı düşünüyorum.Değişik çözümler üreterek daha akılda kalıcı şekilde öğrenmeye ve öğretmeye çalışıyorum.Test2 ile devam edelim.







Bu sefer bir map'e ihtiyaç duymadığımız için bir list kullanarak (Locale sınıf değikenleri) belirli verileri çektik.Test3'e bakalım.


Burada da @HeaderParam ile getirdik.

Önemli yerlere değindiğimizi düşünüyorum.Burada daha çok örnek mevcut.

İYİ ÇALIŞMALAR...




JAX-RS (@MatrixParam ANNOTATION)


      Herkese merhaba.Bu yazımızda @MatrixParam ek açıklamasını öğreneceğiz.Bu annotation daha önce öğrenmiş olduğumuz @QueryParam'a benziyor.Örnek verecek olursak apples?order=random&color=red (@QueryParam) apples;order=random;color=red (@MatrixParam).Görünüş olarak fark bu.Matrix parametleri yolun herhangi bir yerinde olabilir apples;order=random;color=red/10/items gibi.En dikkat çekici farklardan bir tanesi de sorgu parametreleri kaynak olduğundan güvenlik açığı yaratabilir, matrix parametleri ise bir kaynak olmayıp kaynağa başvurma yöntemi olduğundan açık daha azdır.Burada daha fazla bilgi mevcut. Kodlarımıza göz atalım.


         Arkadaşlar bu konuyu iyi anlatamadığımı düşünüyorum.Biraz rahatsız olduğum için birkaç güne düzgün bir şekilde güncelleyeceğim.İYİ ÇALIŞMALAR..

JAX-RS WADL (Web Application Description Language)

       Bu yazımızda WADL'dan bahsedeceğiz. WADL (Web Application Description Language) restful web servislerimizin kullanımı hakkında bilgiler verir.Servisimizin desteklediği http metodları, fonksiyonları , hangi parametrelerin kullanıldığı vb. şeyleri tutan xml tabanlı bir dökümandır. Buna benzer olarak birde swagger var.Ona başka bir yazımızda değineceğiz. Şimdi bir WADL dökümantasyonunun nasıl oluşturulduğuna göz atmadan önce bu gibi dökümantasyonların biraz güvensiz olduğunu okudum. Bakın bir proje geliştiriyor olabilirsiniz. Tabiki projeyi bitirmek,doğru çalışmasını sağlamak önemlidir ama daha da önemlisi projenizin güvenli olmasıdır. En basitinden kullanıcıdan aldığınız verileri kontrol ettirin. Maalesef her kullanıcının niyeti iyi olmuyor. Ben şimdilik sadece eğitim amaçlı yazılar yazdığım için pek fazla dikkat etmiyorum. İleride geliştireceğim yazılımlarda en dikkat edeceğim konu kuşkusuz güvenlik olacaktır. Etrafımızda binlerce yazılımcı var. Aralarında,  bırakın güvenli kod yazmayı,güvenlik kelimesini bile aklına getirmiyor. Bazen değişik sitelere denk geldiğim oluyor. Heryer sql açığı ile dolu. Tamam açık bırakıyorsunuz da açığınız sql açığı olmasın bari.Aşağıdaki wadl sözleşmesini inceleyelim.Gördüğümüz üzere bize rest servisimiz hakkında bilgiler veriyor.



,
İYİ ÇALIŞMALAR

JAX-RS (@DELETE ANNOTATION)

   Herkese merhaba. Bu yazımızda diğer bir http metodu olan delete bakacağız.Delete'te silme işlemi yapıyor. Bu örneğimizde dikkat edeceğimiz en önemli yer delete ve get requestlerine aynı uriyi verdiğimiz yerdir. Bu çok önemli. Uri'nin içinde http metodlarına ait bilgi bulunmamalıdır.Örnek verecek olursak GET/orders/1 dediğimizde id'si 1 olan siparişi göster,DELETE/orders/1 dediğimizde ise id'si 1 olan siparişi silecek. Bu örneğimizde farklı olarak orderServis adında bir enum oluşturduk. Enumlar kodlarımızın daha okunur olmasını sağlar. Enum yerine class oluşturup bir nesne türetip o nesne ile fonksiyonlara erişebilir veya fonksiyonları static yaparak sınıfımızdan direkt olarak erişebilirdik. Enumlar hakkında daha fazla bilgi için buraya tıklayabilirsiniz. Şimdi kodlarımıza ve çıktılarımıza bakalım.







İYİ ÇALIŞMALAR...


JAX-RS (@HEAD ANNOTATION)

        Bu yazımızda başka bir HTTP'i metodu olan HEAD'ı öğrenip kullanacağız. HEAD metodu ile yapılan istekler bize  yanıt olarak boş döner. Bize sadece http yanıt başlıkları ve durum kodları ile ilgili bilgiler döner. Bu sayede HEAD metodu ile servis sağlayıcı hakkında bilgi alınabilir ya da bir kaynağın varlığı doğrulanabilir. Dediğimiz gibi aslında GET gibi çalışır fakat bize response hakkında bilgi verir.Kodları inceleyelim. ApplicationConfig classımızı paylaşmıyorum. Her projemizde kullandığımızı unutmayalım.






İYİ KODLAMALAR.

Spring Boot Uygulamasını Heroku üzerinde Deploy Etme

Bu yazımızda sizlere spring boot ile yazılmış basit bir Rest api'nin heroku üzerinde nasıl deploy edebileceğimizi göstereceğim. Önce ...