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