6 Aralık 2016 Salı

Tablodaki tekrar eden aynı kayıtları bulma işlemi ( Finding duplicates rows in a table via sql )

Merhaba Arkadaşlar,

Bazen bir tabloda aynı kaydın farklı id ile birden fazla kaydedildiğine şahit olabilirsiniz.
Bunun sebebi yanlış tasarlanan veritabanı olabilir, unique constraintler doğru tasarlanmamış olabilir veya başka problemler olabilir. Böyle durumlarda mükerrer ( kendini tekrar eden )  kayıtları bulabilmek için aşağıdaki şekilde sorgunuzu düzenleyebilirsiniz.

  SELECT tablo_alani_1, count(tablo_alani_1)
  FROM tablo_adi
  GROUP BY  tablo_alani_1
  HAVING count(tablo_alani_1) > 1


Yukarıda yapılmak istenen nedir ? Ne yaptık biz şimdi burada derseniz ?

Tablomuz bir personel tablosu olsun diyelim. Aynı sicil numarası ile fakat farklı bir id ile aynı personelden birden fazla kayıt olduğunu düşündüğümüz de, tablodaki sonuçları sicil numarasına göre çekmeliyiz sicil numarasına göre gruplayarak sicil numarasını grup olarak sayarsak tek olan kayıtların count değeri 1 olacak kendini tekrar eden satırın count değeri 2 veya daha fazla olacaktır.
O yüzden having count(*) > 1 diyerek, count değeri 1'den büyük olan kayıt yani mükerrer kaydı tespit etmiş oluruz.
Senaryomuzu aşağıdaki gibi gerçekleyebiliriz.


 SELECT t.sicilNo, count(t.sicilNo)
  FROM personel t
  GROUP BY  t.sicilNo
  HAVING count(t.sicilNo) > 1


Umarım faydalı olur.

</Happy Coding>

6 Şubat 2016 Cumartesi

Hello Spring MVC

Merhaba,

Spring MVC ile ilk projemizi nasıl oluşturacağız ? sorusunu bu yazıda birlikte cevaplayacağız.

Bilgisayarınızda Eclipse ve Java yüklü olması gerekiyor.  Ayrıca Eclipse geliştirme ortamına Spring eklentisini eklemiş olmanız da Spring ve Spring MVC projesi oluştururken işlerimizi hayli kolaylaştıracaktır. Bu yüzden öncelikle Eclipse geliştirme ortamımıza Spring eklentilerini nasıl ekleyeceğimize bir bakalım daha sonra HELLO SPRING MVC diyeceğiz :)

1-) Öncelikle Eclipse geliştirme ortamımıza "Spring Tool Suite" eklentisini kurmalıyız ki Eclipse üzerinden rahatlıkla Spring projesi oluşturabilelim.
Eclipse içerisinde "Eclipse Marketplace"  i açmalıyız.
Bunun için Yardım[HELP]>Eclipse Market[Eclipse Marketplace] yolunu kullanıyoruz.

2-) Açılan market ekranında arama alanına Spring Tool Suite yazıyoruz ve Go tuşu ile aramayı başlatıyoruz.



3-) Arama sonuçları olarak gelen Spring Tool Suite for Eclipse araçlarını seçip kuruyoruz.
Benim cihazımda daha önceden kurulu olduğu için diğer resimleri http://www.codejava.net/ides/eclipse/install-spring-tool-suite-for-existing-eclipse-ide adresinden kullanıyorum. Dilerseniz de ilgili adresten kurulumu devam ettirebilirsiniz tabi ki.



4-) Spring ile ilgili bütün seçenekleri seçerek bir sonraki aşamaya geçiyoruz. Burada bizden lisansı kabul etmemizi bekliyor olacak. Biz de tabiki lisans dosyasını okumadan hemen kabul deyip işlemi tamamlıyoruz. :)



5-) Eclipse geliştirme ortamını yeniden başlattıktan sonra yeni proje oluşturma alanında Spring Project alanının geldiğini görebilirsiniz.

Buraya kadar Spring MVC projemizi oluşturmak için gerekli temel gereksinimleri gerçekleştirdik.

Artık her şey hazır olduğuna göre projemizi oluşturmaya başlayalım.

1-) Yeni[New]>Spring Projesi[Spring Project] yolu ile yeni bir Spring Projesini oluşturmaya niyetlendiğimizi belirtiyoruz. :)



2-) Açılan pencerede bize ne tür bir Spring projesi istediğimizi soruyor aslında. Biz de burada Spring MVC Projesi oluşturacağımızı tekrar söyleceyeceğiz. Fakat dikkat ederseniz Spring MVC Project yazısı yanında aşağı doğru yeşil bir ok var. Yani diyor ki; Bu seçenek seçildiğinde ek dosyalar indirebilir haberin olsun.
Bunun sebebi Spring temel projesi haricinde Spring MVC için farklı kütüphaneleri indirmesi gerektiğidir. Biz yine de Spring MVC Project seçeneğini seçiyoruz ve projemizin adına da FirstMvcProject diyerek sonraki aşamaya geçiyoruz.



3-) Bir sonraki aşamaya geçmeden bize indireceği dosyalar için tekrar hatırlatmada bulunuyor ve bizden onay bekliyor. Biz de onaylıyoruz ve kısa bir indirme işleminin gerçekleşmesine izin veriyoruz.


İndirme işlemi tamamlandıktan sonra bizden temel paket ismini istiyor. İstediğiniz ismi verebilirsiniz tabi ki ama genelde web adreslerinin tersten yazımı şeklinde verilir. Ben bu proje için com.ouz.springmvc olarak belirledim.


4-) İlk projemiz Eclipse ve Spring Tool Suite ortaklığı ile oluşturulmuş durumda. Eğer sol taraftan proje dizin ağacına göz atarsanız pom.xml şeklinde bir dosya göreceksiniz. Bu dosya bize bu projenin bir Maven Projesi olduğunu söylüyor. Maven, proje içerisinde birbirine bağımlı kütüphaneleri bizi yormadan yöneten bir araçtır. pom.xml içerisinde Maven Repository üzerinden alınan kütüphanelerin xml ayarları bulunur. Aynı zamanda projenin deploy(dağıtım) ve build(inşaa) aşamasındaki gerekli ayarlar da belirtilebilir.
src/main/webapp/WEB-INF/spring dizini altında spring configuration file (spring ayar dosyaları) bulunur.
src/main/webapp/WEB-INF/ dizini altında ise bir web projesinde olması gereken web.xml dosyası bulunur.
src/main/webapp/WEB-INF/views dizini altında ise projemizin View katmanını oluşturan .jsp sayfaları bulunur.
Java Resources> src/main/java/com.ouz.springmvc  paketi altında ise Controller katmanını oluşturan Controller sınıfı yer alır. Controller sinifimiz olan HomeController.java sınıfımız içerisine göz atarsanız.

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Locale locale, Model model) {

şeklinde tanımlanan method, proje dizinine yapılan isteklere cevap vermek için yazılan methoddur.
ve dönüş değeri olarak InternalResourceViewResolver e home.jsp 'i çalıştırmasını söylemektedir.






Şimdilik daha fazla detaya girmeden projemizi sağ tıklayıp Run deyip Tomcat serveri seçtiğimizde ilk projemizi yazmış çalıştırmış oluruz :)

 


Karşımıza çıkacak olan src/main/webapp/WEB-INF/views altında yer alan home.jsp sayfayı olacaktır.



home.jsp içeriğini aşağıdaki şekilde değiştirerek baştaki sözümüzü yerine getirmiş olalım :)



Böylece ilk Spring MVC projemizi oluşturmuş ve çalıştırmış olduk.
Başka yazılarda görüşmek üzere.

</HappyCoding>

Apache Tomcat 7.0 Kurulumu - Mac OSX El Capitan

Merhaba,

Bu yazımızda Mac bilgisayarımıza Tomcat 7.0 serverini nasıl kuracağımızı anlatmaya çalışacağım.
Gerekli olan tek şey bilgisayarımızda Java'nın yüklü olmasıdır.
Bunu test etmek için [Cmd]+[Space]  tuş kombinasyonu ile Terminal'i açıyoruz.

>> java -version

komutu ile bilgisayarımızda hangi java versiyonunun yüklü olduğunu görebiliriz. Mac OSX ve Linux cihazlarda Java default olarak yüklü gelir genellikle.

1-) Öncelikle şuradaki adresten Tomcat 7 için .zip veya .tar.gz arşivlenmiş dosyalarından herhangi birini indiriyoruz. Masaüstüne veya İndirilenler klasörü içerisine indirebilirsiniz.
Ben İndirilenler klasörü içerisine indirdim ve aç diyerek arşivden klasörün çıkarılmasını sağlıyoruz.

~/İndirilenler/apache-tomcat-7.0.67

2-) Şimdi indirilenler klasöründe yer alan klasörleri /usr/local dizini altına taşımamız gerekiyor.
Bunun için Terminal'i tekrar açıyoruz. Ve aşağıdaki komutları yazıyoruz. sudo komutundan sonra şifre sorabilir. Şifreniz bilgisayarınız için tanımlanmış şifrenizdir. Ekran da herhangi bir karakter göstermeksizin sizden şifrenizi girmenizi ister.

sudo mkdir -p /usr/local
sudo mv ~/Downloads/apache-tomcat-7.0.67 /usr/local

*3-) 2.adım sonunda tomcat çevresel dizinlere eklenmiş oluyor. Fakat kitaplık üzerinden kısayol ile erişilebilir hale getirmemiz bizim için kolaylık sağlayacaktır. Terminal üzerinden aşağıdaki komut ile gerçekleştiriyoruz.

sudo rm -f /Library/Tomcat7
sudo ln -s /usr/local/apache-tomcat-7.0.47 /Library/Tomcat7


*4-)  Tomcat kurulumunu belirli bir kullanıcı için erişilebilir yapmak isteyebilirsiniz. Bunun için ilgili klasörün sahipliğini değiştirmelisiniz. Bunu da aşağıdaki komutla yapabilirsiniz.

sudo chown -R kullanici_adiniz /Library/Tomcat7


*5-) Tomcat dizini altındaki bütün scriptleri çalıştırılabilir hale getirmek için ise aşağıdaki komut çalıştırmalısınız.

sudo chmod +x /Library/Tomcat7/bin/*.sh

İşlem tamam :)

(*) ile işaretlenmiş maddeler Tomcat serverin çalışması için olsa da olur olmasa da olur durumlardır.


BONUS :)
-> Tomcat 7 Server'i Terminal üzerinden manuel olarak açmak ve kapatmak için ise aşağıdaki komutları kullanabilirsiniz.

Tomcat Manuel Baslat : /Library/Tomcat7/bin/startup.sh

Tomcat Manuel Kapat : /Library/Tomcat7/bin/shutdown.sh


</HappyCoding>

23 Ocak 2016 Cumartesi

PLSQL - DECODE KULLANIMI

Merhaba,

Bazı durumlar olur ki veri çekmek istediğinizde, gelmesi istenen veri koşullara göre değişken davransın. Yani kod içerisinde yazdığımız if-else gibi davransın.
Ya da binlerce kayıt bulunan tablo dökümünde tabloda kayıtlara göre farklılık gösteren kayıtları ayrıştırma işlemini yapıyım isterseniz.
Ya da işte benim bahsedemediğim ama sizin " tam burada (sql içerisinde) bir if-else yazsam " dediğiniz anda işinizi görecek bir komut DECODE komutu.

if-else işlemini sql procedure veya sql fonksiyon içerisinde yazabiliriz elbette ama decode komutunu select işleminde veya where koşulu içerisinde her yerde kullanabiliriz.

Kısaca tanımı;

DECODE( [kontrolIfadesi] , [birinciKosul] , [birinciKosulDOGRUYSADonecekDeger] ,  [ikinciKosul] , [ikinciKosulDOGRUYSADonecekDeger] , [hicbirKosulDOGRUDEGILSEDonecekDeger] )


Yukarıdaki ifadenin türkçe meali şöyle ki;
Decode içerisine ilk parametre olarak kontrol edeceğin ifadeyi koy. Ardından ikinci parametre kontrol ifadesine "eşitse" kontrolünü yapacağın birinci koşul ifadesi, üçüncü parametre ise birinci koşul ifadesi ile kontrol ettiğin ifade eşitse dönecek olan değer. Sıralı şekilde önce koşul hemen ardından koşul sağlanıyorsa döndürülecek değer şeklinde eklenebilir. En sona öncesinde bir koşul konmadan yazılan ifade ise, eğer hiçbir koşul sağlanmazsa gösterilecek değer olacaktır.

Şöyle bir örnek üzerinden daha yakından inceleyelim;

SELECT
p.adi as ADI,
p.soyadi as SOYADI,
p.kimlik_numarasi as KIMLIK_NUMARASI,
DECODE( p.statu,  'M' , 'MEMUR' , 'I' , 'İŞÇİ' , 'S' , 'STAJYER' , 'E' , 'EMEKLİ' , 'TANIMLANMAMIŞ' ) as STATU
FROM personel p ;

Personel tablomuz olsun ve bu tabloda personellerin kayıtları tutulsun. Herbir personel için ise personelin statüsünü tuttuğumuzu varsaydığımız sütunumuz (alanımız) olsun. Bu alanda personellerin statü bilgileri için VARCHAR2(1) tipinde (şeklinde) tanımlanmış verileri tuttuğumuzu varsayalım. Böyle bir senaryo için çalıştırılacak yukarıdaki gibi bir sorguda decode işlemi yaptığımızda, herbir personelin statü alanında yer alan karaktere göre ilgili açıklamayı yazacaktır.

Veritabanında ;
OĞUZ HAN TURAN 11112222324 I
şeklinde olan bir kayıt

yukarıdaki sorgu çalıştırıldığında şöyle gelecektir.
 OĞUZ HAN TURAN 11112222324 İŞÇİ

veya veritabanında;
OĞUZ HAN TURAN 11112222324 T
şeklinde olan bir kayıt

yukarıdaki gibi bir sorgu çalıştırıldığında
OĞUZ HAN TURAN 11112222324 TANIMLANMAMIŞ
şeklinde gelecektir. Çünkü decode ifadesi içerisinde p.statu alanının 'T' ifadesine eşit olduğunda gösterilecek ifadeye yönelik bir  kontrol işlemi gerçekleştirilmemiştir. Bu yüzden en sonra hiçbir koşul ifadesi olmayan değer yazılmıştır.

Başka bir deyişle yukarıdaki SQL ifadesinin basitçe koda çevrilmiş hali şöyledir.

if( p.statu == 'M' )
        System.out.println("MEMUR");
else if( p.statu == 'I' )
        System.out.println("İŞÇİ");
else if( p.statu == 'S' )
        System.out.println("STAJYER");
else if( p.statu == 'E' )
        System.out.println("EMEKLİ");
else
        System.out.println("TANIMLANMAMIŞ");

Umarım açıklayıcı olmuştur.

 </HappyCoding>

PLSQL - Silinen Kayıtları Geri Getirme

Merhaba,

PLSQL ile işlem sırasında bir delete komutu çalıştırırken where koşulu belirtmeyi unuttunuz ve farkında olmadan "commit" işlemi yaptınız. Veya update işleminde yanlış verileri güncellediniz.
Gibi gibi benzer durumlarda commit işlemi yaptığınız tablolardan verileri geri eski haline getirmek istediğiniz olabilir.

Bu gibi işlemler için aşağıdaki komutu kullanabilirsiniz.
Öncelikle komutu veriyorum ardından açıklama yapalım.

insert into [eklenecekTablo] (SELECT * FROM [veriCekilecekTablo] AS OF         TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE)   WHERE [kosulSütunu] = '[kosul]');


[eklenecekTablo]: Burada geri getirdiğimiz verileri ekleyeceğimiz tablo ismi veriyoruz.
Bu tablo silme işlemini gerçekleştirdiğimiz tablonun kendisi de olabilir.
Yani  
[eklenecekTablo] ile  [veriCekilecekTablo] aynı tablo olabilir.

[veriCekilecekTablo]: Yanlış silme işlemi gerçekleştirilmiş veya yanlış güncelleme işlemi yapılmış olan tablo.


AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE : Tablo içerisinde 
60 dakika  içerisinde yer alan veriler içerisinden select işlemi yapacağımızı belirtiyoruz.

[kosulSütunu] = '[kosul]' : Burada son 60 dakika içerisinde silinmiş başka veriler de olabilir  o yüzden koşul belirterek doğru verilerin geri getirilmesini sağlıyoruz.



!!! Eğer son 60 dakika içerisinde tablo üzerinde önce veri ekleme sonra veri silme işlemi yapılmışsa yukarı belirttiğimiz çalışacak bir sorgu, tablonun veri eklenmeden önceki hali üzerinden işlem yapacaktır. O yüzden zaman aralığı ne kadar kısıtlayıcı olursa doğru verinin geri getirilmesi daha kolay ve efektif olacaktır. Bu konuda dikkatli olmak faydalı olur.

</HappyCoding> 

5 Aralık 2015 Cumartesi

Spring MVC 4.0 Web Service @RestController Nedir ?

Merhaba,

Bu yazıda @RestController annotationu nedir ne değildir dilim döndüğünce anlatmaya çalışacağım.

Kısaca söylemek gerekirse @Controller ve @ResponseBody annotationlarının yerine kullanılan, RESTFul web servis methodları yazarken kullanılan işleri kolaylaştıran, Spring MVC 4.0'dan sonra hayatımıza girmiş olan bir annotationdır. @RestController kullandığımız sınıflarda ilgili adreslere cevap verecek methodlar için ayrıca @ResponseBody annotationu eklenmez. Sadece mapping işleminin yapılması yeterli olacaktır.
Spring dökümanlarda da aşağı yukarı bu şekilde tanımlanmaktadır. Buradan Spring dökümandaki tanıma da şahit olabilirsiniz.

Böyle kuru kuru tanım yapınca olmuyor tabi. Eskiye yeniye bir göz atmak gerek.
"İşler nasıl kolaylaştı, önceden ne yapıyorduk şimdi ne yapacağız" bir göz atalım.

Öncelikle @Controller annotationu, bildiğiniz gibi ilgili sınıfın bir controller sınıfı olduğunu belirtir. Yani (spring bean configuration file) Spring konfigürasyon ayarlarımızı barındıran
(eğer başka bir isim verileceği web.xml de tanımlanmamışsa) projeadi-servlet.xml olarak adlandırılmış xml dosyasında;

<context:component-scan base-package="com.[projeAdi].[controllerPaketi]" />
 
    <!-- support for mvc-annotation -->
    <mvc:annotation-driven />


şeklinde belirterek Spring tarafından otomatik tespit edilmesini sağladığımız paketin içeriğindeki tüm alt sınıfların başında kullanılan annotationdır.

@ResponseBody annotationu ise, isteğin cevaplandırılacağı methodun başına yazılır. Böylece nasıl mapping işlemi yapılmışsa, o adres parametreleri ile çağırıldığında ilgili methoda yönlendirilir ve method çalıştırılır.

Aşağıdaki görselde kullanıcıdan gelen isteğin Spring tarafından hangi yollardan geçerek cevaplandırıldığı daha net anlaşılabilir.






Örneğin bir sınıfımız olsun. Bu sınıf controller sınıfımız demek için başına @Controller annotationunu ekliyoruz.

 @Controller
public class ListUserController {
...
...
...
...
}


sınıfımızın başına @Controller annotationu eklendiğinde, eğer spring konfigürasyon ayarlarını doğru yapmışsak, eclipse derleyicisi otomatik olarak ağaç gösterimi üzerinde sınıfın üzerine "S" işareti koyacaktır.



İlgili sınıfın Spring Controller sınıfı olduğundan emin olduktan sonra içerisine bir isteğe cevap verecek bir method yazıyoruz ve yine annotationlar aracılığıyla mapping işlemini gerçekleştiriyoruz. İlgili adrese istek yapıldığında cevap vermesi için @ResponseBody annotationunu method başına ekliyoruz.

@RequestMapping(method = RequestMethod.GET, value = "/service/listUsers")
@ResponseBody
public int listUsers() {

      // burada gerekli istek işlemleri yapılır.
return 0;


}


/service/listUsers adresi çağrıldığında bu method cevap verecektir. Adresleme işlemini ve bu methodun cevap vereceğini @RequestMapping ve @ResponseBody annotationları ile belirtmiş olduk.

Yukarıda yazılan kodlar Spring MVC 4.0'a kadar olan kullanılan yöntemler idi.

 @RestController ile nasıl yazdığımıza bir göz atalım şimdi de.


@RestController
// @RequestMapping("/service")
public class ListUserController {
...
...
...
...
}


sınıfımızın başında @RequestMapping işlemi de yapılabilir yukarıda kod içerisinde gerçekleştirildiği gibi.

İsteklere cevap verecek olan methodumuz için artık sadece adresleme(mapping) işlemi yapmamız yeterli olacaktır.

@RequestMapping(method = RequestMethod.GET, value = "/listUsers")
public int listUsers() {

      // burada gerekli istek işlemleri yapılır.
return 0;


}


Uzun lafı kısası; Spring 4.0 ile hayatımızı girmiş olan @RestController  annotationu, @Controller ve @ResponseBody annotationunun yapmış olduğu işlemleri tek başına yapar.



Son olarak aşağıdaki kaynaklara da göz atabilirsiniz;

http://www.benchresources.net/spring-mvc-creating-restful-web-service-using-annotation/
http://www.benchresources.net/spring-mvc-4-0-restful-web-service-using-restcontroller-annotation/
https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/



</HappyCoding>


21 Eylül 2015 Pazartesi

Web Servis Nedir ? Ne Değildir ? Kimlere Web Servis Denir ?

Merhaba Arkadaşlar,

Web servisler için birçok tanım yapılabilir ama bence en kapsamlı ve açıklayıcı olanı herhalde şudur.

"Web Servisleri, açık protokoller ile iletişim kurmak için kullanılan xml tabanlı bağımsız ve kendini açıklayıcı uygulama bileşenleridir."

Yukarıdaki tanımı biraz kurcalayacak olursak, açık birden fazla protokol olacak bu protokoller arasında iletişim kurulmak istenecek ve biz bu iletişimi sağlamak için bir web servis yazacağız. Yazacağımız web servis xml tabanlı olacak, platform ve yazılım dili bağımsız olacak, kendi kendini tanımlayabilir yani ne demek istiyor burada demeyeceğimiz kadar açıklayıcı olacak.
Web servis tam da budur işte.

Web servis tanımını yaptığımıza göre, web servisler XML ve HTTP nin kombinasyonudur diyebiliriz. Ne demek şimdi ?
HTTP(Hypertext Transfer Protocol) Client - Server arasında kullanılan en yaygın haberleşme protokolüdür. Özellikle web üzerindeki haberleşmelerde. Ee bizim web servislerde XML(Extensible Markup Languagetabanlı değil miydi ? İşte bu yüzden XML ve HTTP kombinasyonudur diyebilir. XML tabanlı yazılıyor olması web servislerini platform ve programlama dili bağımsız hale getiriyor.
Bir web servis yazdınız diyelim, bu web servise php ile yazılmış bir web sitesinden, swift ile yazılmış bir ios projesinden, C# ile yazılmış bir masaüstü uygulamadan veya aklınıza gelen herhangi bir dil ile yazılmış başka bir uygulamadan erişebilirsiniz, kullanabilirsiniz.



Web servisler için farklı platformlar ve farklı kurallar kullanılabilir. Fakat en yaygın olarak kullanılanları şunlardır;

  1. SOAP(Simple Object Access Protocol)
  2. UDDI(Universal Description, Discovery and Integration) 
  3. WSDL(Web Service Description Language)

Biz burada SOAP web servislerden bahsettik ama RESTful web servislerde bulunmaktadır.
Peki nedir bu ikisi arasındaki farklar derseniz -ki deyiniz lütfen :) -

SOAP Web Servislerinin Avantajları;


  • Daha Güvenli : SOAP web servisler WS Security olarak bilinen kendine özgü güvenlik önlemleri barındırır.
  • Platform ve Programlama Dili Bağımsız : XML tabanlı olmasıına müteakip :) platform ve dil bağımsızdır.


Dezavantajları;


  • Yavaş : SOAP web servisler RESTful web servislere göre daha yavaş çalışma mekanizmasına sahiptirler. Bunun sebebi SOAP web servisler, güvenlik önlemlerinden dolayı ayrıştırılması gereken XML formatını kullanır ve bunu okunabilir şekilde parse etmek zorundadırlar. Bu işlem takip edilmesi gereken birçok prosedür, standart ve kural barındırıyor. Bu sebepten ötürü, SOAP web servisler daha yavaş çalışırlar ve daha fazla bant genişliği gereksinimine ihtiyaç duyarlar.
  • WSDL Bağımlılığı : SOAP web servisler bir servisi keşfedebilmek tanımlayabilmek ve çözümleyebilmek için yalnızca WSDL mekanizmasını kullanırlar. Bu da aslında istemediğimiz bir şekilde bir kurala veya standarta bağımlılık getiriyor.



Restful web servisleri için aynı şekilde inceleme yaptığımızda birinden olmayanın diğerinde olmasını bekliyoruz doğal olarak. :)


RESTful Web Servislerinin Avantajları;


  • Hızlı : RESTful web servisler SOAP web servislere göre daha hızlıdır. Çünkü herhangi bir bağımlılığı ve takip etmesi gereken herhangi bir kural ya da standart yoktur. Bu yüzden daha hızlıdır.
  • Platform ve Programlama Dili Bağımsız : XML tabanlı olmasıına müteakip :) platform ve dil bağımsızdır. SOAP web servisleri ile ortak özellik olarak düşünülebilir.
  • Farklı Formatlara İzin Verir (Bağımsız) : SOAP yalnızca XML veri formatına ve XML veri formatının bazı kurallara göre dönüştürülmesini zorunlu kılıyorken, RESTful web servisler JSON, HTML, TEXT gibi formatlara izin vermektedir. Bu da format bağımsızlığı sağlıyor diyebiliriz.
  • SOAP Kullanabilir :  Bu madde biraz garip gelebilir ama gerçek :) RESTful web servisler SOAP kullanabilirler. Bunun sebebi; RESTful web servisler bir mimaridir. SOAP ise bir protokoldür. Bu yüzden RESTful web servislerine SOAP implement edilerek kullanılabilir.


Dezavantajları;

  • Daha Az Güvenli : RESTful web servisler herhangi bir güvenlik önlemi barındırmamaktadır. Tabi yazılımı gerçekleştiren sizin almış olduğunuz önlemler başka. Burada bahsedilen kendisi herhangi bir önlemi zorunlu kılmamakta ve içerisinde barındırmamaktadır. 


Son olarak ufak bir teminolojiden bahsetsek faydalı olacaktır.
JAX-RS  : RESTful web servisler için kullanılan JAVA API dir.
JAX-WS : SOAP web servisler için kullanılan JAVA API dir.


Son olarak UDDI ve WSDL den bahsederek bitirelim.

UDDI (Universal Description, Discovery and Integration)
Adından da anlaşılacağı üzere, evrensel tanımlama, keşfetme ve entegre etme frameworküdür. Bu anahtar kelimelerle yola çıktığımızda, web servislerini evrensel dilde tanımlayan, interneti kullanarak keşfeden, listeleyen, hangilerinin entegre edilebilir olduğunu belirleyen ve dizinleri depolayan bir frameworktür. SOAP ve WSDL ile birlikte kullanılır.


WSDL(Web Service Description Language)
Yine adından anlaşılacağı üzere, web servislerini tanımlama dilidir. Basit manada XML formatlı bir dökümandır. Web servislerini, methodlarını, özelliklerini ve yerlerini tanımlar. WSDL dökümanlarında bulunması gereken 4 temel bileşen vardır. Bunlar;
<types>       : Servis tarafından kullanılacak veri tiplerini tanımlar.
<message>  : Servis tarafından kullanılacak mesaj içeriğini barındırır.
<binding>   : Servis tarafından kullanılacak port bilgisini barındırır.
<portType> : Servis tarafından kullanılacak method veya operasyonu barındırır.

Örnek bir WSDL dökümanı aşağıdaki gibi tanımlanabilir.

<message name="newTermValues">
  <part name="term" type="xs:string"/>
  <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="setTerm">
    <input name="newTerm" message="newTermValues"/>
  </operation>
</portType >