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 >

29 Haziran 2015 Pazartesi

Hello Swift

Merhaba Arkadaşlar,

Bu yazı dizisi ve bu domain altında Swift ile öğrendiklerimi, hem daha sonra kendime bir kaynak oluşturmak hem de sizlerin faydalanması için paylaşacağım. Mümkün olduğunca farklı kaynaklardan edindiğim bilgilerle, mümkün olan en temel bilgilerle, mümkün olan en ufak adımlarla ilerleyeceğiz. Her bir konu sonunda, "Hello World" dahi olsa çalışır bir uygulama yapacağız.
Çok uzun giriş yazıları ile sıkmadan ( bu ilk yazıdır, ilk yazının günahı olmaz :) ) direkt olarak amaç hedef doğrultusunda ilerlemeye çalışacağım.

Adettendir, yeni programlama dili hakkında bilgi verilir. :) Swift programlama dili Apple firması tarafından iOS ve MacOSX işletim sistemlerine uygulama geliştirmek için hazırladığı, geliştirdiği sunduğu bir programlama dilidir. Bu da demek oluyor ki ilerleyen zamanda Apple Objective-C ile yollarını ayıracak tabi bu ayrılma cihaz desteği olarak değil, bundan sonraki geliştirme süreci ve programlama dili desteği olarak düşünülmelidir.
Apple'in Swift için kullandığı anahtar kelimeler, "Güvenli","Modern" ve "Güçlü". Bu 3 kelimeyi çokca programlama dili için duyarsınız. :) Ama biz yine de böyle olacağını en azından olması gerektiğini bilelim ve öyle ilerleyelim.
Yani kısaca, yeni bir programlama dili, Apple firması gibi sağlam bir firma gücü var. Yükselen bir trendi var. Sabırla devam edilerek ilerisi için güzel işler çıkartılabilir.

Son olarak kullanmamız gereken geliştirme aracı XCode 6 olacaktır. :)

Yazı dizisine başlamadan kullanacağım kaynakları sizinle de paylaşayım ki siz de oradan ilerleyebilirsiniz veya benim görmediğimi görerek yazı dizisinin daha güzel ilerlemesine katkıda bulunabilirsiniz.

*1- Apple'in kendi yayımladığı referans kitabı => The Swift Programming Language
2- Treehouse adlı web sitesinin kaynaklarından bir parça => yazı dizisi
*3- Başka güzel bir yazı dizisi => http://jamesonquave.com/blog/developing-ios-apps-using-swift-tutorial/
4- http://www.weheartswift.com/swift-classes-part-1/#primary
5- http://ios-blog.co.uk/tutorials/developing-ios-apps-using-swift-part-1/
6- http://www.swift-tutorial.io/learn-swift
7- http://www.aidanf.net/posts/episode-0-introduction
*8- Apple Developers =>
https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309
9- İşin Object-Oriented ile İlerleyişi => http://www.weheartswift.com/object-oriented-programming-swift/

şimdilik bu kadar kaynak ekleyeyim ama yeri geldikçe yazı içerisinde hangi kaynaklardan faydalandığım hakkında notlar düşeceğim. Yıldızlı olanlar benim favorilerimdir. :)

Artık Hello Swift demenin zamanı geldi sanırım. :)
Daha önceden bir programlama dili öğrenmiş veya öğrenme aşamasında bulunmuş Swift'e geçerken çokca benzerlikler görecektir. İlk defa programlamayı öğrenmeye Swift ile başlayan arkadaşlarda korkmasınlar bu başlangıç sizin için daha iyi olacaktır.

"Hello World" uygulamaları her programlama dili için başlangıç gibidir. Çünkü bir programlama diline başlarken ilk başta "Hello World" uygulamasını çalıştırırsanız, o programlama dilini öğrenmeye hazırsınız demektir.

Öncelikle ilk projemizi açalım.

XCode 6 ile ilk projemizi oluşturuyoruz. Projemiz seçerken farklı alternatifler var fakat şimdilik SingleView Application diyerek burayı geçelim. İlerleyen kısımlarda herbir proje alternatiflerini açıklamaya çalışacağım. Şimdi açıklamaya başlarsak daha ilk yazıdan soğuruz. :)

Projenize istediğiniz ismi verebilirsiniz. Ben HelloProject dedim. Programlama dili olarak "Swift" seçiyoruz.




Gelen ekranda birden fazla fonksiyon çıkacak karşımıza, bu fonksiyonları da fonksiyonları anlatırken veya yeri geldiğinde bahsedeceğim. Şimdilik bu fonksiyonlara da takılmamanız daha iyi olacaktır.

"Eee artık ona takılma buna takılma Hello World u nereye yazacağız" demeyin ahanda buraya yazıyoruz.

Default olarak gelen fonksiyonlar aslında uygulama başlatılırken veya sonlandırılırken tetiklenen fonksiyonlardır. Burada farklı iki zamanda çağırılan fonksiyonları fark edebilmemiz açısından iki farklı fonksiyon içerisine iki farklı print(""); komutu yazalım.


Yukarıdaki resimde ViewController.swift dosyası içerisine UIViewController sınıfından Override edilmiş method olan, override func viewDidLoad(){} methodu ilgili View Load olmadan önce yüklenecek olan methottur. Bu method içerisinde print ile mesajımızı yazıyoruz. 

Daha sonra aşağıdaki resimde olduğu gibi AppDelegate.swift sınıfı içerisinde, func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { } methodu application start edildiğinde başlatılır. Buraya da print(""); ile bir mesaj daha yazalım ve yukarıda solda bulunan start düğmesi ile çalıştırdığımızda alttaki konsolda çıktıların sırasını göreceğiz.



Fonksiyonların sırası ve işleyişi açısından ayrıca ilk uygulama olması münasebetiyle şimdilik bu kadar.
Başka bir yazıda görüşmek üzere.

<HappyCoding />