JAX-RS (ACCESSING CONTEXT INFORMATION)

      Bu yazımızda @context ek açıklamasının bizlere sunduğu içerik bilgilerini inceleyeceğiz.

Injecting Application

   İlk olarak application'dan başlıyoruz.Burada ApplicationConfig classımızda extends ettiğimiz Application classındaki getProperties methodunu override ederek kaynak sınıfımıza enjekte edeceğiz.Bu sayede kaynak sınıflarımızı ApplicationConfig class'ımızdan kontrol edebiliriz.Şimdi bunu basitçe nasıl yapabileceğimize bakalım.


Gördüğünüz gibi,böylece ApplicationConfig sınıfımızda yaptığımız bir değişiklik kaynak sınıfımızı da etkileyecek.Şimdi de browser ve server çıktılarına bakalım.


Injecting UriInfo

        Aynı şekilde UriInfo arayüzümüzdeki fonksiyonların kullanımına ve bunların yine aynı şekilde server'ımızda tutulan log'una bakalım.




Injecting HttpHeaders



Umarım faydalı olmuştur.Bir sonraki yazımızda görüşmek üzere.

JAX-RS (ABORTING FILTER)

     Bu yazımızda filter konusuna devam ediceğiz.Bu seferde kaynak sınıfımız için yazdığımız bir filter'ımızı bazı koşullarda kullanması,bazı koşullarda ise kullanmaması için bir filter daha yazacağız.Bir süzgeç düşünün ve orada portakal suyunu çekirdeklerinden süzüp içeceksiniz.İşte portakalın çekirdekleri ilk yazdığımız filter'a takılıyor dolayısıyla ikinci yazdığımız filterda(mide) bunu kullanmıyor. :).Burada ilk filter çekirdeği görünce,ikinci filter'ı iptal ediyor.Mesela gelen isteklerin veya herhangi bir bilginin log'lanmasını istemediğimiz zaman uygulayabiliriz.Şimdi kodlarımıza bakıp daha iyi anlayalım.


Kodlarımızda gördüğünüz gibi.InvalidRequestFilter sınıfımızda yazdığımız kontrol methodunda gelen isteğe göre değer döndürülüyor.Sınıf adı Ingilizce metod Türkçe ne biçim iş yapıyorsun diyebilirsiniz :) fakat kodlar buradaki sayfaya ait ve ben bu kodları yazarken bazı yerlerde ufak oynamalar yapıyorum.Şimdi de çıktımıza bakalım. GET/orders/history isteği hariç diğer tüm istekler sunucumuzda kayıt ediliyor.Aşağıdaki çıktılarda gördüğünüz gibi.


Umarım faydalı olmuştur.Görüşmek üzere.

JAX-RS (FILTER BINDING & DYNAMIC FILTER BINDING)

     Herkese merhaba.Bu yazımızda da yine filter konusunda yazacağımız filter sadece belli kaynak fonksiyonlarına özel olacak.Bunu yaparken ilk defa kendi açıklamamızı oluşturacağız.Daha sonra yazdığımız filter ve kullanacağı kaynak fonksiyon,sınıf,interface veya her neyse,bu açıklama ile işaretlenecek.Binding olayıda tam da burada karşımıza çıkıyor.Türkçe anlamıyla bağlayıcı olan bu kelimenin görevi anlaşılacağı gibi adından geliyor.Gördüğünüz gibi filter ile belli bir kaynağı birbirine bağlayacak.Ek açıklamamızı (Annotation) kodlarken satırlarımızı tek tek açıklayacağız.Şimdi kodlama kısmına geçelim.Üzerinde duracağımız tek yer annotation'ın oluşturulduğu yer.Yazdığımız bu ek açıklama ile bağlayacağımız yerleri işaretlememiz gerekiyor.Kodlar üzerinden devam edelim.



Şuan logged adında bir annotation oluşturduk.@target açıklaması yazdığımız logged açıklamasının nerelerde kullanılabileceğini belirtiyor.TYPE ve METHOD birlikte kullanılmış.Bunun anlamı yazdığımız annotation hem fonksiyonlar üzerinde hem de sınıf,interface,enum gibi yapılarda çalışabilir.Bir sonraki satırda ise @Retention açıklamasında bu yazdığımız açıklamaya hangi zamanda erişilsin.Bu değerin varsayılanı RetentionPolicy.CLASS'tır.Burada kullanılan RUNTIME ise bu açıklamaya sadece çalışma zamanında erişim vardır anlamındadır.Bu da java da Java Reflection API tarafından yapılır.Buradan araştırabilirsiniz.Şimdide kodlarımızın geri kalanına bakıp programımızı derleyelim.

Çıktımız ise şu şekilde olacak.Sadece GET/customers gibi bir istekte sunucumuza herhangi bir ek kayıt düşmeyecek.Yani filter kullanılmayacak fakat eğer GET/customers/{id} gibi bir istek gelirse filter kullanılacak.Aşağıdaki görsellerde de çok açık bir şekilde görünüyor.




Bu işi dinamik olarakta gerçekleştirebiliriz.Yani aynı şekilde istediğimiz alanlar için bir filter yazmak istiyorsak,dynamicfeature interfaceni imlement edip gerekli kontrolleri yapamız gerekir.


Umarım faydalı olmuştur.Sağlıcakla kalın.

JAX-RS (FILTER PRIORITIES)

    Bu yazımızda da bir önceki yazımızda olduğu gibi filter yazmaya devam edeceğiz.Bu yazımızda bir önceki yazımıza ilaveten bir filter yazmak yerine projemizde birden fazla filter'ı nasıl yazabileceğimize değineceğiz.Burada yardımımıza koşan ek açıklama ise @priorities.Türkçe anlamı öncelik olan bu ek açıklama yazdığımız filter'ları çalışma sırasına göre sıralıyor.Bu ek açıklama aldığı integer parametre ile filter'ları sıralıyor.Şimdi timefilter ve logfilter adında iki filter yazıp bunların hangi sırada çalışacağını belirleyelim.


Gördüğünüz gibi iki filter yazıp bunlara sıra verdik.Parametre değeri düşük olan daha önce çalışacak.Şimdi de resource ve applicationconfig sınıfımızı yazıp örneğimizi çalıştıralım.


Ve programımızı derleyip payara sunucumuzundaki çıktılarımıza göz atalım.




Gördüğünüz gibi önce time filter'ımız daha sonra log filter'ımız çalışıyor.Umarım faydalı olmuştur.Bir sonraki yazımızda görüşmek üzere.

JAX-RS (FILTERS)

         Bu yazımızda filter konusuna değineceğiz.Biz filter'ları gelen request ve giden response mesajlarını kaynak sınıfımıza erişmeden önce kontrol etmek için yazarız.Örnek verecek olursak login sayfamız için bir filter yazarsak gelen request mesajlarını kontrol ettirip bu sonuca göre kaynak sınıflarımıza erişim izni verebiliriz.Bu yazımızda basit olarak gelen her isteği kapsayan bir filter'ı nasıl yazacağımıza bakalım.Yazacağımız filter bir logfilter olup request ve response mesajları payara yerel sunucumuzda log'lanacak.Bir filter yazabilmemiz için ConteinerRequestFilter ve ConteinerResponseFilter interface'lerinden birini veya ikisini implement etmemiz gerekiyor.Şimdi bir kaynak sınıfı ve bir filter sınıfı yazarak konumuzu pekiştirelim.



Kaynak sınıfımız gördüğünüz gibi.Gelen her istek için kullanıcıya gösterilecek mesaj sabit (dummy-response for) olacak.Şimdide gelen mesajları inceleyebilmek için bir filter yazalım.Bu istekler yazdığımız filter'a takılacak ve sunucumuzda log'lanacak.Şimdilik yapılan isteklerde kaynaklarımıza erişim sağlanabiliyor.Bir sonraki yazımızda ise filter'ımızı geçemeyen istekler belirtilen kaynaklara erişemeyecek.



Gördüğünüz üzere request mesajlarımız için ContainerRequestFilter ve response mesajlarımız için de ContainerResponseFilter interface'lerini implement ettik.Bu interface'lerimizde bulunan filter fonksiyonlarını override ettik.Daha sonra bir log fonksiyonu yazarak  server'ımızda görüntülenecek request ve response mesajlarımızın bazı kısımlarını getirdik.Şimdi tarayıcımızdaki ve sunucumuzdaki çıktılar bakalım.



Şimdide oluşacak bir IOException da,log'umuzda tutulacak kayıt'a bakalım.Girilen % karakterinin oluşturduğu bir exceptionda payara serverımızda aşağıdaki şekilde loglanmış.




Umarım faydalı olmuştur.




OAUTH2.0 NEDİR ? NERELERDE KULLANILIR ?

 

         Bu yazımızda OAUTH 2.0'dan bahsedeceğiz.OAUTH standartlaşmış bir yetkilendirme protokolüdür.Bir uygulamadaki kullanıcı kaynaklarının,kullanıcının izni ile belirtilen yetkilerin,bir başka uygulamaya güvenli bir şekilde verilmesini sağlıyor.

      Diyelim ki bir platform üzerinde bir sosyal medya hesabı oluşturmak istiyorsunuz.Bu uygulamaya üye olabilmeniz için facebook ile giriş yap diye bir butona tıklayıp,facebook hesabınızın kullanıcı adı ve şifre bilgilerinizi girdikten sonra,uygulamanın erişmek istediği izinleri kabul ettiniz.(Sizin yerinize paylaşım yapma veya arkadaşlarınızı görebilme gibi).İşte bu aşamalarda OAUTH 2.0 kullanılıyor.Bu protokol önceki ve sonraki sürümleriyle uyumsuz.Zaten OAUTH1.0'daki güvenlik açıklarının giderilmesi amacıyla geliştirilmiş.Bu arada oltalama adı verilen,örneğimizde verdiğimiz yetkileri değilde tüm yetkileri eline geçiren bir  hackleme olayı var.Sahte arayüz tasarım ile kullanıcının bilgileri alınıp hesabı ele geçiriliyor.Bir banka üzerinden örneklendirelim.A bankasının internet bankacılığı sitesinin bir kopyası oluşturulmuş olsun.Bu sitenin adresi www.xyzbank.com olsun.Buradan yapılan girişlerde kullanıcı bilgileri ağda şifrelenmiş olarak akar,güvenlidir.Fakat siyah şapkalı hacker diye tarif ettiğimiz hacker'lar bu sitenin template'ini kopyalayıp www.xyzbankr.com domain'i aracılığıyla erişime açıyor.Daha sonra instagram gibi reklamların kolayca verildiği sitede tanındık bir banka ismine reklam veriyor.İnternet sitemizden giriş yapan ilk 10 kişi kol saati hediye veriyoruz diye.Altınada basıyor sahte adresi :).İnstagramın saçmalık diye nitelendirdiğim bir reklam politikası.Neyse sonra buna inanan insanlar bu adresi tıklayıp sazan gibi bilgilerini giriyorlar.Neyse telefona gelen doğrulama mesajı içinde bir arayüz oluşturuyorlar.Daha sonra kullanıcı arkadaş güzelce tüm bilgilerini hacker'lara post ediyor.Bu hacker'larda hesaba anlık olarak giriş yapıyor.Daha sonra hesaptaki tüm parayı çekiyorlar.Bazıları az çekiyor bu sayede dikkat çekmeyeceğini düşünüyor.İleride bir bankada çalışacak olursam bu sorunu çözebilirim :).Bence burada ilk suçlu bu reklamı verdirtende,sonraki suçlu bilgi sahibi olmayan kullanıcıda.En büyük suçluda insanların açıklarından kar elde etmeye çalışan siyah şapkalı hacker'lar.O siyah şapkayı çıkartıp,beyaz şapka kullanmalarını tavsiye ediyoruz :).

     Kullanacağımız uygulamayı bizim sosyal medya uygulamamıza yetkilendirme yapılırken access token'ler kullanılıyor.Aşağıda bu olayı anlatan çok güzel bir animasyon mevcut.Bu animasyona ve bu konu ile ilgili daha fazla bilgiye ulaşmak istiyorsanız animasyon kaynağına buradan gidebilirsiniz.


Şimdi n11.com'a kendi facebook hesabımızdan bazı yetkiler vererek giriş yapalım.


Bu şekilde izinler doğrultusunda hesap bilgilerim kayıtlı olduğunda direkt devam et seçeneği geliyor.Ben buradan giriş yaparken erişebilecekleri yerleri kısıtladım.Her uygulamaya her yetkiyi vermeyin.Bu şekilde bu teknolojiden bahsetmeye çalıştım.Umarım faydalı olmuştur.
İYİ ÇALIŞMALAR :)

JAX-RS (CONTEXT PROVIDER)

    Bu yazımızda daha önce de bahsettiğimiz kaynak sağlayıcılarını nasıl kullanacağımızı öğreneceğiz.Bu sağlayıcılar kaynak sınıflarımıza bir bağlam nesnesi sunar.Bu cümleyi kodlarımızı inceledikten sonra çok daha iyi anlayacağız.



       Sağlayıcımızdan başlayalım.Öncelikle MyContext(içerik) adında bir generic interface oluşturup get fonksiyonumuzu tanımladık.Daha sonra MyContextResolver (içerik çözümleyici) sınıfımızı oluşturup @Provider ek açıklaması ile işaretleyip ContextResolver<T extends object> interface'imizi implement ettik.Daha sonra bu sınıfımız içerisinde bulunan ve yazdığımız MyContext sınıfımızı implement eden MyContextImpl sınıfımızı yazdık.Type'ımızı String olarak belirlediğimiz için override edilmesi gereken fonksiyonumuzun geri dönüşü tipi String oldu.Aynı şekilde ContextResolver<MyContext> olduğu için ezdiğimiz fonksiyonun geri dönüş tipi MyContext oldu.Bu şekilde sağlayıcıları yazmış olduk.Şimdide kaynak sınıfımıza bakalım.


 
   

      Kaynak sınıfımızda ise @GET metodu ile kullanıcıdan alınan parametre String path değişkeninde tutulmuş.Daha sonra @Context ek açıklamasıyla Providers interface'inden bir nesne türetilmiş.@Context ek açıklamasını daha ayrıntılı öğrenmek istiyorsanız buraya tıklayınız.Sonraki işlemlerde bildiğimiz klasik işlemler.Bir de WILCARD_TYPE var.WILCARD_TYPE içinde bilinmeyen bir sınıfın nesnelerini tutar.
Çıktımız ise bu şekilde 

http://localhost:8080/ContextProvider/contextprovider
response: a context value for key = contextprovider


GÖRÜŞMEK ÜZERE...



HTTPCLIENT4 (WORKING WITH RESPONSE HEADER)

       Herkese merhaba.Bu yazımızda http response mesajımızın başlığı üzerinde çalışacağız.Bir response mesajı oluşturup bu mesajımıza bir başlıklar ekleyip bu başlıkları farklı şekillerde görüntüleyeceğiz.Hadi başlayalım.



Burada bir response paketi oluşturup bu pakete 2 başlık ekledik.İki cookie.Daha sonra bu başlıkları getirdik.








Daha sonra bunu bir iterator yardımı ile yaptık.Yani 20 tane cookie başlığımız olsa 20'sini de çekecek.


 Ve son olarak bu çerezleri parametre olarak çektik.Bu şekilde gelen paramatrelere göre işlemler yaptırabilir üzerlerinde daha kolay çalışabilir.

İYİ ÇALIŞMALAR...

HTTPCLIENT4 (REQUEST && RESPONSE)

      Herkese merhaba.Bu yazımızda httpclient ile bir URI oluşturup http get metodu ile request mesajımızı oluşturacağız.Aynı şekilde basit bir response mesajı oluşturup bu mesajı ayrıntılı yazdıracağız.Kodlarımıza bakalım.


Burada java.net kütüphanesini kullanarak bir URI oluşturduk.Scheme'ye http host'a www.google.com dedik.Daha sonra bir path belirleyip parametrelerimizi girdik(key,value şeklinde QueryParam) finally httpget ile request mesajımızı gerçekleyip URI'mizi ekrana bastık.:) 

Aynı şekilde basit bir response mesajı oluşturup (version,status,mesaj) bu satırı parça parça ekrana bastık.İYİ ÇALIŞMALAR...

JAX-RS (ENTITY PROVIDERS-YAML)

         Bu yazımızda java nesnelerini YAML formatına veya YAML formatını java nesnelerine dönüştüreceğiz.Herhangi bir dilde yazılmış nesneler,YAML formatında tutulabiliriz.Üstelik YAML configrasyon dosyalarında kullanılan XML veya JSON yerine de tercih edilebilir.YAML formatı insanlar tarafından kolay okunabilmesinin yanında kolaylıkla yazılabilir.Şimdi entity provider'ı nasıl kullanacağımıza ve YAML formatındaki dönüşümleri inceleyelim.Bunun için pom.xml dosyamıza YAML bağımlılığını eklemeliyiz.


Kaynak 
Kaynak
Şekiller de gördüğünüz gibi.Resimlerin üzerine tıklayarak kaynağa gidebilirsiniz.
Şimdi de Java'da yazdığımız kodları adım adım yorumlayalım.





EmployeeResource ve Employee sınıflarımızda kayda değer birşey yok.Daha önce öğrendiğimiz ek açıklamalar ile basit bir servis yazılmış.Dikkat edilecek tek yer, @Consume("application/yaml") olarak belirtilmiş.









Gördüğünüz gibi YamlEntityProvider<T> adında bir entity class'ımız mevcut.Entity classlarının kullanım amaçlarından biride o sınıfta kullanılacak veri tipinin sabit olmasıdır.Buna bağlı olarak güvelik seviyesi de artıyor.Implement ettiğimiz interface'teki fonksiyonları override etme zorunluluğunuz olduğunu biliyorsunuzdur.İşte bu yüzden bu interface'teki fonksiyonlar override ettik.Bu sınıfın provider olduğu açıklanmış ve @Produces ve @Consumes ile girdi çıktı işlemlerinin formatları belirlenmiş.Override edilmiş fonksiyonlarda okuma,yazma ve kontrol işlemlerini yaptık.Burada javanın input/output sınıfından yararlandık.Client sınıfımızda ise get,put ve delete metodlarımızı deneme amaçlı 3 fonksiyon yazdık.Burada dikkat edilmesi gereken
 yer ise .register(new YamlEntityProvider<>()).Sağlayıcımızı kaydettik,gibi düşünebilirsiniz.Çıktımız ise aşağıda.
Bu yazımın devamı gelecektir.İyi çalışmalar...


JAX-RS (PROVIDERS)

  

      Daha önceki yazılarımızda RESTful web servislerinde  kaynak sınıflarımızı nasıl oluşturacağımızı öğrenmiştik.Bu yazımızdan itibaren ise JAX-RS'teki sağlayıcıları öğreneceğiz.Sağlayıcılar, JAX-RS çalışma alanını genişletmek için kullanılabileceğimiz bir yoldur.JAX-RS'te sağlayıcıları kullanırken @Provider ek açıklamasını kullanacağız.Bu sağlayıcıları 3'e ayrılıyor.

1)Entity Providers(Varlık Sağlayıcıları)
    
    Varlık sağlayıcıları xml,json gibi veri formatların java nesneleri ile iletişimi sağlarlar.Bu sağlayıcılar MessageBodyReader ve MessageBodyWriter interface'lerini implement ederler.Verinin saklanma türü @Consumes ve @Produces ek açıklamalarıyla belirtilmemiş ise sağlayıcılar tüm türleri destekler.

2)Context Providers(İçerik-Ortam Sağlayıcıları)

     İçerik sağlayıcıları ise @Context ek açıklamasıyla erişebilecekleri bağlamları kontrol eder.Bu sağlayıcılar ContextResolver <T> interface'ini implement ederler.


3)Exception Providers(İstisna sağlayıcıları)

   
      Hata sağlayıcıları, Java istisnalarının http response cevaplarına eşler,karşılaştırır ve bizde bu sonuçlara göre değişik şeyler yapabiliriz.Bu sağlayıcılar ise ExceptionMapper<T> interface'ini implement ederler.Bu 3'üde sağlayıcı olduğundan @Provider ek açıklamasını kullanmak zorundadır.



Bir sonraki yazımızda görüşmek üzere.Huzurlu günler...

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