CXF ile Rest Client

Daha önce bir çok kez farklı kütüphanelerle nasıl Rest servisler için client yazılacağına deÄŸinmiÅŸtim. Åžimdi ise benzer ÅŸekilde CXF kullanarak nasıl yapılacağına bakalım. Bu server ki Client ile diÄŸerlerinin en büyük farklı, API’nizi önceden tanımlamamız. Bunu yaparkende sanki Jax-RS servisi yazarmış gibi birebir aynı annotasyonları kullanmamız.

Projenin Yaratılması

Projemizi Spring-Boot kullanarak basit bir web projesi gibi oluÅŸturacağız. Ama sadece CXF ile client tanımlamalarını yapıp, Junit ile test metodu yazacağız. CXF bildiÄŸiniz üzere hem JAX-WS hem JAX-RS implementasyonu içeriyor. Biz JAX-RS implementasyonu tarafından rest client’ı oluÅŸturup, testlerde bu rest client’ını kullnacağız. Test’te ana uygulama da aynı context’i kullandığından projenizde istediÄŸiniz katmanda testteki gibi kullanabilirsiniz.

Intellij üzerinden yeni bir proje yaratıyoruz fakat proje türü olarak Spring Initializr seçiyoruz. Bu bizi bir takım adımlardan götürecek ve uygulamamızı tamamlamış olacağız. EÄŸer intellij kullanmıyorsanız aynı adımları https://start.spring.io/ adresinden de yapabilirsiniz. Intellij’de bu adımları https://start.spring.io/ adresinden temin ediyor.

SpringInitializr’ı seçtikten sonra next dediÄŸimizde, gelen safyadan sadece web kımısnı seçiyoruz. Bundan baÅŸka CXF bağımlılığımız var ama onu sonradan kendimiz ekleyeceÄŸiz. Sonraki ekranlardaki bilgileri ise aÅŸağıdaki gibi dolduruyorum.

  • Name: cxf-rest-client
  • Group: com.bahadirakin
  • Artifact: cxf-rest-client
  • Package: com.bahadirakin.rest

Projemiz oluÅŸtuÄŸuna göre ÅŸimdi CXF için gerekli bağımlılıkları ekleyebiliriz. TüketeceÄŸimiz servis JSON konuÅŸtuÄŸundan aynı zamanda Jackson bağımlılıklarını da ekliyoruz. Jackson nesneden json’a ve json’dan nesneye çevirim yapabilen bir kütüphane. Benim en sevdiÄŸim özelliklerinden biri doÄŸrudan Jaxb annotasyonlarını kullanarak çevirim yapabilmesi.

pom.xml

Rest API

Ben servis olarak daha önceki yazı dizisinde oluÅŸturduÄŸum kullanıcı servisini kullanacağımz. Basit bir arayüz içerisinden CRUD iÅŸlemlerini yapmamızı saÄŸlayan bir servis bu. Ama siz isterseniz baÅŸka bir public api’da (GitHub ya da Facebook gibi) kullanabilirsiniz. TüketeceÄŸim servisten kısaca bahsedecek olursam

API’ın kullanıcı güncelleme ve silme ile iligli metodları da mevcut. İsterseniz client’ınıza bunlarıda ekleyebilirsiniz. Fakat ben basitlik saÄŸlaması açısından bu kadarla bırakacağım. Anlayacağınız üzere client tarafında tüm API’ı kapsamak zorunda deÄŸilsiniz.

Åžimdi bu metodları bir interface üzerinde JAX-RS annotasyonları ile gerçekleyelim. CXF üzerinden client taratırken bu interface’i kullanacağız. Öncelikle src/main/java altına com.bahadirakin.rest.api isminde bir paket yaratıyoruz. Daha sonra bu paketin altına UserService isminde bir interface yaratıyoruz.

UserInterface.java

CXF ve Spring Ayarları

Kullanacağımız arayüzü yarattığımıza göre şimdi cxf ve spring üzerinden hangi adresten hangi servisi kullanacağımızı belirtelim. Bunun için src/main/resources altına cxf-client-context.xml isminde bir dosya yaratıyoruz ve içeriğini aşağıdaki gibi yapıyoruz.

cxf-client-context.xml

Burada dikkat etmenizi istediğim kısımlar aşağıdaki gibidir:

  • Client yaratırken serviceClass kısmında UserService interface’ini kullandık.
  • Servisimizde kullanacağımız header tanımlamalarımızı burada yapabiliyoruz.
  • EÄŸer Http basic authentication kullanacaksak yine burada kullanıcı adı ve ÅŸifremizi belirtebiliriz.

Åžimdi ise bu xml dosyamızı ana application context’imize ekleyelim. Spring-Boot tüm varsayılan ayarlarını annotasyon tabanlı yapıyor. Projenizi ilk oluÅŸturduÄŸunuzda da bu sınıfı bizim için oluÅŸturuyor. EÄŸer benimle aynı ismi verdiyseniz bu sınıf CxfRestClientApplication isminde olmalı ve com.bahadirakin.rest paketi altında bulunmalı. Bunun bir eÅŸleniÄŸide test içerisinde olmalı. Bu sınıfın başına ImportResource annotasyonunu kullanarak yeni xml dosyamızı ekliyoruz. Son durumda CxfRestClientApplication sınıfı aÅŸağıdaki gibi oluyor.

CxfRestClientApplication.java

Client’ın Test Edilmesi

Tüm ayarları ve tanımlamaları yaptığımıza göre ÅŸimdi client’ımızı test edebiliriz. Bunun için hali hazırda bulunan CxfRestClientApplicationTests sınıfına UserService nesnemizi inject edip yeni bir test yazıyoruz. Son durumda CxfRestClientApplicationTests sınıfı aÅŸağıdaki gibi oluyor. Bu sınıftaki testleri çalıştırdığınızda bir sorun olmadığını ve datanın düzgün gelip gittiÄŸini göreceksiniz.

CxfRestClientApplicationTests.java

Sonoctobiwan

Bana API olarak tanımlayıp sonrasında tüketmek çok daha mantıklı bir çözüm gibi geldi. Bunu tek yapan kütüphane CXF deÄŸil. Retrofit’te benzer iÅŸlevi yapıyor, üstelik Spring bağımlılığı olmadan. Daha hafif birÅŸey arıyorsanız kesinlikle Retrofit’e de bir bakmanızı tavsiye ederim. Son olarak projenin son haline aÅŸağıdaki adresten ulaÅŸabilirsiniz.

End of line