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