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.

JAX-RS (@PUT ANNOTATION)

    Herkese merhaba.Bu yazımızda bir başka HTTP metodu olan PUT'u öğreneceğiz. Daha önce @GET ve @POST'u öğrenmiştik. Put veri güncellememizi sağlıyor. Bu tip bir request mesajı oluşturduğumuzda güncellemek istediğimiz veri bulunup istenilen değer ile güncelleniyor. Güncellemek istediğimiz veri bulunmaz ise bu veri post ediliyor. Eğer zaten var ise herhangi bir işlem gerçekleşmeyecektir. Bu örneğimizde ise item sınıfımızdaki override ettiğimiz equals ve hashcode fonksiyonları önemlidir. Burada kontrol edilecek verinin hangi tipte olduğu bilinmediği için bu fonksiyonları override ediyoruz. Yani örneğin bir String değişkeninin diyelim ki a,bunun başka bir a'ya eşit olduğunu String sınıfı bilir fakat bizim yazdığımız item sınıfı gelen değişkenin int'mi String'mi olduğunu bilmez ve bilmediği içinde bu put'ta hataya yol açar.Aynı veri tekrar eklenebilir. Web servis kısmımızda ise girilen verilenin hangi formatta olduğunu ve bu verinin list'emizde bulunup bulunmadığını kontrol ettik. Eğer bu veri mevcut ise http 204 kodlu response yok ise bu veriyi ekleyip 201 kodlu response mesajını gönderir. Kodlarımıza ve test çıktımıza bakalım.

Arkadaşlar bu aralar çok fazla çalışıyorum. Bundan şikayetçimiyim,asla değilim. Hepsi hayallerim için. Belki de benim hayallerimin geçtiği yol ile sizin hayalleriniz kesiştiği için yazılarımı takip ediyorsunuzdur. Ne olursa olsun vazgeçmeyin.İnsan beyni herşeyi öğrenecek güçtedir. Ha rakibiniz 4 saatte siz 6 saattemi öğreniyorsunuz. O 12 saat çalışıyorsa siz 24 saat çalışın.Neyse bu arada bu yazılara bakmadan önce Java'nın Collections kütüphanesine bir göz atın. Ve anlamadığınız her satırı araştırın veya sorun.






Kendinize iyi bakın.İyi çalışmalar...


JAX-RS (@POST ANNOTATION)

       Herkese merhaba. Bu yazımızda http methodlarından post'un nasıl kullanıldığını göreceğiz.Daha önceki yazılarımızda post'un veri eklemek için kullanıldığını belirtmiştik. Şimdi de farklı formatlar ekleyip farklı formatlarda response mesajlarını getireceğimiz çok güzel bir uygulamayı ele alacağız.Uygulamamızdaki sınıflardan bahsedecek olursak,customer java entity'lerimiz üzerinde işlemler yapmak için,CustomerDataService classımızdan veri ekleyip veri çekeceğiz. Burada javanın util sınıfından faydalanacağız.ClientApp ve ClientUtil classlarımızı ise verilerimizi değişik formatlarda post etmek ve aynı şekilde get etmek için kullanacağız. CustomerWebService classımızda ise belli kurallar çerçevesinde yaptığımız HTTP request metodlarıyla verileri üzerinde işlemler yapacağız. Bu örnek diğerlerine göre biraz daha önemli olduğu için her classımızın fonksiyonlarına ayrı ayrı değinmeye çalışacağım. Hadi başlayalım.



Sınıfımızı incelemeden önce Customer.java adlı sınıfımızın olduğunu ve bu sınıfımızda name,address ve phonenumber adındaki değişkenlerimizin setter ve getter metodlarının bulunduğunu unutmayalım. Bu classımızda verilerimiz list yardımı ile işlenmiş. addCustomer metodumuzda id ile birlikte parametre olarak alınan customer nesnesi customerList'e depolanıyor.newId ise bir nevi veritabanındaki AutoIncrement gibi çalışıyor. getCustomerList fonksiyonumuz bize o listede bulunan tüm değerleri list olarak döndürüyor.Aynı şekilde getCustomerById fonksiyonumuz da parametre olarak alınan id değerini liste içinde arıyor.Bu değerde bir veri var ise geri döndürüyor yok ise null değer döndürüyor.Bu fonksiyonun customer tipinde değer döndürdüğüne dikkat edelim. Consturctor'ın içindede
list'emize veri ekledik.Bunu tarayıcımız üzerinde GET isteği ile verinin nasıl geldiğini görmek için yaptık




Şimdide web servis sınıfımıza bakalım.Bir önceki yazımızda @Consumes ve @Produces ek açıklamalarından bahsetmiştik.Burada @GET requestin'e karşılık response döndürebilecek iki adet fonksiyon var. GET/api/customers ve GET/api/customers/0 istekler bu formatta olmalı. Bu fonksiyonların verileri JSON formatında üreteceğini görüyoruz. Diğer bir fonksiyonumuzda gelen bir post isteğini dataservisimizi kullanarak gerçekleştiriyor ve gördüğünüz üzere addCustomer metodumuz bize yeni eklenen müşterinin id'sini döndürüyor.Bu id düz yazı formatında dönüyor.Kullanıcının ise bu POST isteğinde kullanacağı verinin JSON formatında olması gerekiyor (@Consumes).Buraya kadar olan kısmı çalıştırıp GET metoduyla yapılan istekleri kontrol edelim.







Bu sınıfımız clientapp sınıfımıza yardımcı bir sınıf olarak müşteri yaratmamızı sağlıyor.Bu müşteri bilgilerini JSON ve düz yazı olarak yaratan iki fonksiyonumuz mevcut.

Bu sınıfımızdaki fonksiyonlar ise oluşturduğumuz webservisine uygun formatlarda requestler yaparak dönen değerleri yazdırıyor.Buradaki mantığı anlatacak olursak siz bir request yaparken bunun isteğini belirtirsiniz.Daha sonra bu isteği yapacağınız hedef adresinizin bilinmesi ve bu adrese gidebilmeniz için bir sunucunuzun olması gerekiyor.Sunucu demişken önceki örneklerimizde glassfish'i kullanırken bu ve sonraki örneklerimizde Ertuğrul hocamın tavsiyesiyle payara'yı kullanacağız. Glassfish'ten kurtulmanın mutluluğu içerisindeyiz.Bunu kutlamamız gerekiyor :). Neyse devam edelim.Tabiki yapacağınız post isteklerinde verinin hangi formatta olduğuda önemli bunun içinde clientutil sınıfımızı yazmıştık.Önce projemizi run edip daha sonra clientapp sınıfımızı run ettiğimizi unutmayalım. Şimdi çıktılarımıza bakalım.

Umarım anlatabilmişimdir :).Herkese huzurlu günler diliyorum...






JAX-RS (RETURNING JSON RESPONSE)

   Arkadaşlar merhaba.Bu yazımızda response mesajımızın nasıl json formatında  döndürüleceğine bakacağız.Customer adında bir entity sınıfımız olacak.Getter ve setter metodlarımız ile verilerimizi kontrol edeceğiz.CustomerDataService adındaki sınıfımızdan gelen veriyi restful web servisimizde json formatında response edeceğiz.Veri sıkıntısı çekmemek için javanın data factory kütüphanesini kullanacağız.CustomerDataService sınıfımızda datafactory'den aldığımız verileri bir List'e dolduracağız.Daha sonra web servisimizde bu verileri json formatında döndüreceğiz.Burada kullanacağımız  ek açıklama @Produces(üretmek).Hazır olun JSON üreteceğiz :)Şimdide kodlarımıza ve çıktımıza göz atalım.






İYİ ÇALIŞMALAR...


Bu arada JAX-RS yazılarımda kaynak olarak https://www.logicbig.com 'u kullanıyorum.Çok iyi bir site bakmanızı tavsiye ederim.Kod örnekleri oradan.Kendi kodumuzu yazamazmıyız yazarız fakat bende yeni yeni başladığım için şimdilik kendi yazdıkları kodlardan gidiyoruz.Konularda ilerledikçe kendi uygulamalarımızı geliştireceğiz.İlk projemizi http methodlarının hepsini öğrendikten sonra,hepsini kullanabileceğimiz bir proje geliştireceğiz.Sağlıcakla kalın... 

API İLE WEB SERVİSİ ARASINDAKİ FARKLAR

      API (Application Programming Interface) kısaca bir uygulamanın belirtilen işlevlerinin başka bir uygulama içerisinde kullanılması.Yani iki uygulama arasında bir görevi görür.Web servisi ise ağ üzerindeki iki makine üzerindeki etkileşimi kolaylaştırır.Bir web servisi genellikle(RESTful'da yok) web hizmeti açıklama dilinde (WSDL) makine ile işlenebilir biçimde tasvir edilen bir arabirime sahip olacak şekilde tasarlanmış.Bildiğiniz gibi en yaygın kullanılan protokol HTTP.Web servislerinde iletişim olarak REST,SOAP ve XML-RCP kullanılır.API uygulamalar arasında etkileşimi başlatmak için herhangi bir iletişim aracını kullanır.En önemli noktalardan bir taneside budur.Örneğin, sistem çağrıları Linux çekirdeği API'sı tarafından kesmeler kullanılarak çağrılıriWeb servisi, HTTP'ye sarılmış bir API'dır.API, etkileşimi kolaylaştırmak bir yazılım programının eksiksiz bir kurallar ve teknik özellikler kümesinden oluşur. Bir Web hizmeti, eksiksiz bir teknik özellikler kümesini içermeyebilir ve bazen tam bir API'den mümkün olabilecek tüm görevleri gerçekleştiremeyebilir.API'ler aşağıdakileri içeren çeşitli yollarla açığa çıkabilir: C / C ++ programlama dilinde COM nesneleri, DLL ve .H dosyaları, Java'da JAR dosyaları veya RMI,  HTTP üzerinden JSON, vb. Web'de API'yi açığa çıkarmak için servis bir ağ üzerinden gerçekleştirlimesi zorunludur.


  Özetlemek gerekirse:

1)Her Web servisi bir API'dir fakat her API bir web servisi olmak zorunda değildir.

2)Web servisleri,bir API'nin gerçekleştireceği tüm işlemleri gerçekleştiremeyebilir.

3)Bir Web hizmeti sadece üç kullanım şekli kullanır: SOAP, REST ve XML-RPC
API iletişim için herhangi birini kullanabilir.

4)Bir Web servisinin her zaman için bir ağ'a ihtiyacı olurken bir API'nin
çalışması için ağ'a ihtiyacı yoktur gerekmez.




Kaynak
http://www.differencebetween.net/technology/internet/difference-between-api-and-web-service/



İYİ ÇALIŞMALAR...






JAX-RS (REGEX && RETURNING RESPONSE)

     Bugünkü yazımızda REGEX kullanmayı ve kullanıcıya değişik response mesajları döndürmeyi öğreneceğiz.Önceki yazılarımızda response olarak hep bir string mesajı döndürdük.Hatalı bir istekte glassfish bize 404 not found mesajını döndürüyor.Bugün yapacağımız örnekte kullanıcıdan belli bir kurala göre orderId ve itemId isteyeceğiz.Bu kurala uyarsa 200/OK yanıtı,uymaz ise 400 bad request yanıtını göndereceğiz.Daha sonra programımızı çalıştırıp wireshark üzerinden pakelerimizi inceleyeceğiz.Hadi başlayalım.Meşhur class'ımız ApplicationConfig herzaman ki yerini almış durumda :).OrderService classımıza bakalım.Daha sonra paketlerimizi inceleyelim.









 Wireshark'ın genel görünümü


İlk isteğimiz formatımıza uygun olduğu için OK mesajı ikinci isteğimiz ise uygun olmadığı için BAD REQUEST mesajını aldık.Wireshark ağınızda akan paketleri inceleyebilirsiniz.Bir sonraki yazımızda görüşmek üzere.Sağlıcakla kalın...

JAX-RS (@QueryParam&@DefaultValue)

     Herkese merhaba.Bu yazımızda @QueryParam ek açıklamasını öğreneceğiz.Bir önceki yazılarımızda belirttiğimiz @PathParam açıklamasının yetersiz olduğunu düşünmüşler ki böyle bir açıklama daha ekleme ihtiyacı duymuşlar :)Ya da kullanıcıya daha geniş bir kullanım alana sunmak.
GET/api/bagiscilar diye yapılan bir istekte bize bağışçıların tümünün döneceğini öğrenmiştik.Fakat kullanıcının bunu daha fazla sınırlayabildiğini de biliyoruz.Örneğin 3 id numarasına sahip bagışcı.Peki ya biz Hatay'daki AB+ kan grubuna sahip bağışçıları istiyoruz.Aklınıza GET/api/bagiscilar/Hatay/ABRH+ gelmis olabilir.Fakat bu isteği çok daha fazla uzatabilir.Mesela Hatay'daki 25 yaşüstü erkek ve A RH+ kan grubuna sahip bagışçıları getir deyince kaç türlü kombinasyon çıktığını düşünün :)İşte bu durumlarda yardımımıza @QueryParam yetişiyor.Yazdığımız query string'e göre istenilen veriyi çekiyor.Şimdi örneğimize geçelim.Örneğimizdeki sorgu GET/api/order?startPage=10&&pageSize=20 gibi.Bu çok daha fazla uzayabilir.Herzamanki gibi ApplicationConfig classımız aynı şekilde görevine hazır bir şekilde projemizde yerini almış durumda :)Daha sonra yazdığımız orderService classımızda kullandığımız @QueryParam ve @DefaultValue açıklamalarına dikkat edelim.@DefaultValue belirtilen isime ait her hangi bir veri girilmezse o alanın hangi değere sahip olacağını belirtiyor.Kodlarımızı inceleyip uygulamamızı çalıştıralım.



Bir sonraki yazımızda görüşmek dileğiyle.İyi çalışmalar.

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 ...