Axis2 ve SwA

SOAP mimarisi size temel veritiplerini göndermenize olanak sağladığı gibi resim, ses dosyası gibi verileri göndermenizede olanak sağlamaktadır. SOAP mimarisi size bunu sağladığı gibi bunu yapmanında farklı farklı yolları bulunmaktadır. Bu farklı yolların en basidi verinizi SwA (Soap with Attachments) kullanmaktır. SwA kullandığınız takdirde geri dönecek mesajı dert etmeniz gerekmemektedir. Axis2 nin desteklediği diğer bir yol ise MTOM’dur. MTOM size geri dönecek mesajınızı istediğiniz gibi değiştirmenize olanak sağlar. Daha gelişmiş ve karmaşık bir yol olmasına karşın, eğer tek istediğiniz ekte bir resim ya da ses dosyası göndermekse gereğinden fazla soruna yol açmaktadır.

Hazırlık

Genel olarak, bu zamana kadar yaptığınız Axis2 projelerinde ihtiyacınız olan dosyalara burada da ihtiyacınız olacaktır. Ben konunun basit olması ve çabuk anlaşılması açısından Axis ve Maven yazısında bahsettiğimiz örnek proje üzerinden ilerleyeceğim. Orada yapılmış olan porje üzerinden ilerleyeceğiz. Eğer daha önce Axis2, Tomcat, Maven ya da Eclipse kurmadıysanız geri dönüp eksiklerinizi kapatmalısınız.

Uygulama

Şimdi SwA ile dosya gönderebileceğimizi anladık. Fakat önemli olan dosyayı kimin göndereceği ve dosyayı kimin alacağıdır. Bende bunu düşünerek her iki isteğide yerine getirecek örnekler sunmayı planlıyorum.

Servisten Istemciye Dosya Gönderimi (Download)

İlk örneğimizi servisten istemciyi dosyanın nasıl gönderileceği üzerine yapacağım. Zaten biraz çevirimiçi araştırma yaptıysanız sizde örneklerin çoğunun İstemciden Servise Dosya Gönderimi şeklinde olduğunu görmüşsünüzdür. Bundan dolayı ben daha az yapılanı yapmak adına servisten istemciye dosyanın nasıl gönderileceğini anlatarak başlayacağım. Bunu anlatmaya Axis ve Maven yazısında ne yaptığımızı anlataracak başlayacağım.

Axis ve Maven yazısında basit bir servis geliştirdik. Geliştirdiğimiz bu servisin adı SimpleService.java idi. Sonrasında bu servisi WEB-INF/services/SimpleService/META-INF yolundaki services.xml dosyasının içerisine tanımlamıştık. Arından ise bu porjeyi farklı ortamlarda nasıl çalıştıracağımıza bakmıştık. Şimdi ise bu SimpleService sınıfına yeni bir method ekleyeceğiz. Bu metod istemciye dönen mesaja bizim belirlediğimiz bir resim dosyasını iliştirecek.

İstemci yazma kısmı servis ile benzediğinden istemci yazmayacağım. Bunun yerine testlerimi SOAP-UI üzerinden gerçekleştireceğim.

Sınıflar ve Ayarlar

Öncelikle SimpleService.java sınıfımız içerisine “String getImage()” imzalı bir metod ekleyelim. Burada dönüş tipini istediğiniz gibi değiştirebilirsiniz. Kendi istediğiniz sınıfı döndürebilirsiniz. Göndereceğimiz dosya ile bu sınıf(String) arasında hiç bir bağlantı yoktur. SwA’y MTOM’dan ayıran en güzel özellikte budur. Ben örnek kolay olsun diye sabit dosya yolu olan bir resim ekleyeceğim.  Eklediğim resim C: altında olacak. Bu sayede erişebileceğim. Fakat tabikide sizin yapacağınız uygulamada dosya yolu değişken olacaktır. Şunu söylemekte fayda var resim gönderme işlemlerinde dosya yolunuzun çok net olması gerekmektedir. Yoksa Java’da dosyayı göstereceğim diye kafayı yiyebilirsiniz.

SimpleService.java

...
public String getImage() {
     FileDataSource fileDataSource = new FileDataSource(new File("C:\\soapui32.png"));
     DataHandler dataHandler = new DataHandler(fileDataSource);
     String contentID = "png-file";
     try {
          MessageContext inMessageContext = MessageContext.getCurrentMessageContext();
          OperationContext operationContext = inMessageContext.getOperationContext();
          MessageContext outMessageContext = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
          outMessageContext.addAttachment(contentID, dataHandler);
     } catch (AxisFault e) {
          System.err.println("Error while getting out message context");
          return "FAILD!";
     }
     return "SUCCESS...Content-ID (cid) = png-file";
}
...

Burada genel olarak dikkat etmeniz gereken kısımlar:

  • Dosyanızı şuanki MessageContext sınıfına değil, giden MessageContext sınıfına ekliyorsunuz
  • ContentID ya da cid önemli bir bilgidir. Genel olarak bu tip web metodlarında bu bilginin geri döndürülmesi istemci tarafında büyük kolaylıklar sağlamaktadır.
  • Ne yaparsanız yapın sadece bu kadar eklmeyle SwA etkin olmaz. Bundan dolayı aşağıdaki ayarlamalarıda yapmanız gerekmektedir.

Burdan sonra yapmanız gereken SwA özelliğini servisiniz için aktif etmektir. Bunu aşağıdaki tek satırı services.xml dosyasında SwA etkin etmek istediğiniz service taglerinin arasına yerleştirmeniz yeterli olacaktır.

services.xml

<parameter name="enableSwA" locked="false">true</parameter>

Burdan sonra tek yapmanız gereken servisinizi Tomcat ya da başka bir Servlet Container üzerine yüklemek.

Test

Test etmek işin en kolay kısmı. SOAP-UI programını açıyoruz. Yukarıdaki web adresinde tanımlı olan WSDL’i soap-ui programına yüklüyoruz. Kendisi bize tanımlı olan tüm web metodlarını ve bu web metodları için taslak halindeki istekleri çıkartıyor. Aslında Groovy Scriptleri kullanılarak otomatikleştirilmiş testlere kadar bir ço şey yapabiliyorda bunlar ne yazık ki bu yazımızın konusuna dahil değil.

Neyse oluşan metodlardan test edeceğimiz metodu yani getImage() metodunu seçiyoruz. İşerisinde bulunan taslak halindeki istek dosyasını açıyoruz. Metodumuz hiç değişken almadığından gördüğünüz üzere taslağımızda değişken içermiyor. Taslak halindeki isteğimizi çalıştırdığımızda karşımıza bizim olumlu dönüş bildiren ve cid içeren mesajımız geliyor.

Eğer dikkat ettiyseniz normal isteklerden farklı olarak alt tarafta Attachments kısmı 1 olarak gözüküyor. Bu mesaj içeriğimizin doğru geldiğinin bir göstergesi. Attachments kısmında bulunan dosyayı paint ya da benzeri bir resim programıyla açarsanız dosyamızın başarıyla geldiğini sizde görebilirsiniz.

Istemciden Servise Dosya Gönderimi (Upload)

Öncelikle bu özellği ayrıntılı olarak anlatmayacağım. Eğer axis2’yi indirip örneklerinde biraz dolaştıysanız zaten anlatmamıda istemeyeceksinizdir. Axis2 ana klasörünün altında samples klasörünün içerisinde İstemciden Servise dosya gönderen bir örnek bulunuyor. Bu örneği Ant kullanarak çabucak derleyebilirsiniz. Gayet net bir örnek olduğundan anlaşılacağını düşünüyorum. Örnek hem servis kısmını hem istemci kısmını içermektedir.

Sadece bir kaç noktaya dikkatinizi çekmek istiyorum:

  • Örnekte anlatılan attachmentID, contentID‘dir. Gördüğünüz üzere Axis2 örneklerinde de contentID gönderilmektedir.
  • Istemci üzerinden dosya göndermek için mesaj içeriğini elinizle yaratmanız gerekebiliyor.

Son

Umarım dosya gönderiminin nasıl yapılacağı konusunda bilgi sahibi olmuşsunuzdur.

End of Line