Feb
14
2010
6

PHP ile web servis oluşturmak

Sanırım ilk önce web servis nedir, neden gereklidir kısaca buna değinmek gerek. İnternette çokca kaynak bulabilirsiniz bu konuda, güzel anlatılmış ,bolca teknik terimler ile desteklenmiş. Ama ben farklı bir yaklaşım tarzı ile, mümkün olduğunca sade bir biçimde ele almaya çalışacağım.

Güzel bir uygulama geliştirdik, güzel güzel çalışıyor. Ama gün geldi farklı bir platformdan,farklı fiziksel bir yerdeki bir uygulama ile iletişim kurması, veri alışverişi yapması gerekti. Ne yapacağız, o dili mi öğreneceğiz ?  İşte bu durumda web servisler devreye giriyor.

Web servis ile, internet üzerinde herhangi bir platformdaki, herhangi bir dille yazılmış bir uygulama ile veri alışverişi gerçekleştirebiliriz. Bunu sadece veri alışverişi olarak sınırlamak da pek doğru değil, ama girişte bunun böyle bilinmesi sanırım yeterli olacak.

Konumuza bir örnek ile devam edelim. Bir siteniz var ve bu sitenizden kullanıcılarınız üyelik sistemi ile yararlanabiliyor. Bu sistemde kullanıcılarınıza SMS ile bilgi vermeye yarayan bir özellik aktif etmek istiyorsunuz. Ama bu servisi kontrol etmek elimizde değil, bu yüzden farklı bir yerden satın almak zorundayız. Biz SMS servisini satın aldıktan sonra, satıcı bize SMS gönderme işlemini kendi uygulamamız içerisinde gerçekleştirebilemiz için bir API (Applcation Programing Interface Uygulama Geliştirme Arayüzü) sunar. İşte bu API lerin iletişim yöntemlerinden biri de web servislerdir.

Yukarıda da bahsettiğimiz gibi, farklı platformlarımız var, ve bunların birbiri ile anlaşması gerekiyor. İşte burda da SOAP devreye giriyor. SOAP (Simple Object Access Protocol , Basit Nesne Erişim Protokolü). Tabiki ne bu bahsettiğimiz API çağrıları için, ne de web servis işlemleri için tek protokol SOAP değildir. Ama burda vereceğim örnekteki amaç SOAP dır.

PHP ile web servis geliştirme işlemi gerçekten çok kolaydır. Bunu iki farklı yöntem ile gerçekleştirebiliriz. Birincisi WSDL yardımı ile, ikincisi WSDL olmadan direkt PHP sınıfları ile. Birinci seçenek farklı bir yazımın konusu olacağından, ikinci yönteme geçelim.

Sistemin işleyebilmesi için bir sunucu , bir de istemci olması gerekiyor. Her ikisinin farklı yerde , farklı platform/dil de olması gerekiyordu, bizim örneğimizin işlevselliğini gösterebilmek için. Ama elimizde şu anda PHP var ve bu yüzden diğer özellikleri bir kenera bırakarak salt PHP ile yolumuza devam ediyoruz.

İlk önce sunucu tarafındaki kodlarımızı oluşturalım :

1
2
3
4
5
6
7
<?php
class SMS {
   public function gonder($mesaj,$konu,$kime){
      return 'mesaj gonderildi';    
        }
}
 $sunucu=new SoapServer(null,array('uri'=>'http://ersindogan-testuri'));

$sunucu->setClass(‘SMS’);

$sunucu->handle();

Yukarıdaki kodumuzun içeriği bir anlamda tam değil, sadece uzak yordam çağrısı yapacağız, bize bir sonuç döndürmesi yeterli. Bu yüzden SMS mesajını başarılı bir biçimde göndermiş gibi yapan bir sunucu oluşturduk. Evet birkaç satır kod ile bunu başardık. Şimdi kısaca anlatmatya çalışayım yukarıdaki kodu :

SMS diye bir sınıf oluşturduk, bu sınıfımız SMS göndermeye , SMS gönderme işleminin sonucunu döndürmeye yarıyor. Sunucu olarak oluşturduğumuz nesne bir SoapSever nesnesi. Bu SoapServer nesnemiz, gelen uzak yordam çağrılarının, belirlenen şartlar doğrultusunda çalıştırılmasını ve sonucunun istemciye döndürülmesini sağlamak ile görevli.
Burda SoapServer nesnemize, SMS sınıfını baz almasını ve bu nesnenin metodlarını çalıştırabileceğini söyledik. Eğer bunun dışında çalıştırılması istenenen sınıf-fonksiyon çağrısı gelirse SoapServer istemciye hata döndürecektir.

SoapSever nesnemizi burda WSDLsiz oluşturduk ,WSDLsiz oluşturduğumuz için bir URI (Uniform Resource Identifier Tekörnek Kaynak Tanımlayıcı) tanımlamamız gerekir, bu uri herhangi bir benzersiz url olabilir. Bunu değiştirip değiştirmemek size kalmış. Daha sonra sunucumuzun baz alacağı nesnemizi tanımlıyoruz, son olarak da handle metodu ile de sunucumuzun gelen isteklere cevap vermesini sağlıyoruz. Şimdi de istemci tarfımızı oluşturalım.

1
2
3
4
<?php
$istemci=new SoapClient(null,array('uri'=>'http://ersindogan-testuri','location'=>'http://localhost/test/sunucu.php'));
var_dump($istemci->gonder('mesaj','konu','kime'));
?>

İşte istemci tarafımızda bitti. Yukarıdaki kodu anlatmadan önce, web sunucunuzda test diye bir klasör oluşturup içerisine sunucu.php ve istemci.php adında iki dosya ekleyin. sunucu.php dosyasına sunucu ile ilgili kodları ekleyin, istemci.php dosyasına da istemci ile ilgili kodları kopyalayıp dosyaları kaydedin. Daha sonra adres satırından http://localhost/test/istemci.php yazdığımızda

string ‘mesaj gonderildi’ (length=16)

biçiminde bir mesaj verecektir.
Şimdi en son yazdığımız kodu anlatabiliriz. Yukarıdaki kodda, istemcimiz , belirtilen sunucudaki metodu çağırdı ve sonucu aldı.
Çoğunlukla bu tür işlemleri aynı makinada, aynı platformda, hatta aynı programlama dilinde bile yapmazsınız. Taraflar hep farlıdır, ama anlaşma metodu ortaktır. İşte bu ortak nokta yardımı ile uzak sistemden bir yordam çağrısı yaparak işlemlerimizi gerçekleştirebiliriz.
Konuyu elimden geldiğince toparlayarak anlatmaya çalıştım, eksik -anlaşılmayan yerler olursa yorum düşerseniz cevaplarım mutlaka.
Bu konunun bir sonraki adımı WSDL de görüşmek üzere, hoşça kalın.

Powered by WordPress | conserio | xoppla | TheBuckmaker