Feb
14
2010

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
8
9
10
11
<?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.

22 Yorum »

  • darkness says:

    Teşekkürler emeğine sağlık….

  • recai cansız says:

    Bilgi için teşekkürler ersin bey..

  • Ersin says:

    Rica ederim.

  • Zend Soap Autodiscovery ile WSDL oluşturma kısmını kolayca atlayabilirsin. Kullanılacak methodları belirlediğin bir classın olması yeterli. Tabi kod yorumlarını düzgün yazmak gerekiyor.

    http://framework.zend.com/manual/1.10/en/zend.soap.autodiscovery.html

  • Ersin says:

    Tabi eğer ZendFramework kullanırsak bu mümkün. ZendFrameworksuz da bir hayat var dışarıda Murat :)

  • medyum says:

    ersin bey çok teşekkür ederim

  • Hazar Artuner says:

    Çok güzel anlatmışsın çok teşekkür ederim. İnternette okadar çok kaynak varki çokluğundan dolayı belkide çoğu karman çorman ve özensiz anlatımlar, ama senin anlatım tarzın çok hoşuma gitti tekrardan çok teşekkür ederim.

  • Cem says:

    Tam açıklayıcı olmamış. Daha doğrusu konuyu biraz daha açarak anlatabilir misiniz ? Yukarıda tanımladığınız sms sınıfını istemcide ya da sunucuda kullanmamışsınız. Ayrıca bu soap komutları yarleşik mi yoksa birşeyler import etmek gerekiyor mu. Ve de bu sms servisini nereden nasıl alabileceğimizi açıklarsanız..Ve de başka bir kaynaktan okuduğum kadarıyla SOAP iyi olmasına karşın karışık olduğunu söylüyor ve REST adlı bir yöntemden bahsediyor. Bu yöntemi de biraz açıklayabilir misiniz. Amcım öğrenmek olduğundan bunları sordum, yoksa herhangi bir eleştiri söz konusu değildir. Sizin gibi bilgisini paylaşan insanlara minnettarız.

  • Ersin says:

    Web serviste iki taraf vardır,sunucu ve istemci. Normal şartlarda hem sunucu hem de istemci tarafını siz yazmazsınız. Burda çalışma mantığını anlatabilmek için hem sunucu hem de istemci tarafını yazmak zorunda kaldım. Bu yüzden bir karmaşa olmuş olabilir.

    Örneğin ilgi çekici olabilmesi için, sunucu tarafındaki servisin SMS gönderdiğini varsaydım. Yani normalde sunucu tarafında gerçekten SMS gönderen bir kod yok. Sadece temsili olarak oluşturulmuş, geriye sadece bir string döndüren basit bir metodu olan bir sınıf. Bunun haricinde SMS hizmetini başka bir yerden almadım daha önce.

    SOAP XML tabanlı bir mimaridir, sistemler arası iletişim için kullanılır. İki sistem, standartları belli olan XML ler ile iletişim kurar. SOAP diye bir sınıfın PHPde olması sizi şaşırtmasın, bu nesne sadece web servis işlemlerinizi bir nebze olsun kolaylaştırmak için oluşturulmuştur. Eğer bu SOAP sınıfı olmasa idi :
    - Web servisde kullanılan WSDL i manuel olarak oluşturmanız
    - Sunucu tarafı iseniz, web servis çağrılarına istek verecek bir sunucu; istemci tarafı iseniz, servis alacağınız yere bağlanmanızı gerektirecek, HTTP protokolü ile iletişim kurabilen bir istemci yazmanız gerekirdi.

    Daha önce web servisler ile ilgili birşeyler yazmaya çaıştım. Burdan http://www.ersindogan.com/tag/wsdl takip edebilirsiniz.
    Ayrıca burdan SOAP ile ilgi daha açıklayıcı örnek ve bilgilere ulaşabilirsiniz.

    REST , SOAP a göre daha kolay ve sistemde herhangi bir ek kütüphaneye gerek kalmadan çalışabilen bir web servis mimarisidir. Bu yüzden avantajlı olabilir. REST hakkında ilerleyen zamanlarda birşeyler yazmaya çalışacağım.

    Eleştiriye her zaman açığım, ilginiz için teşekkürler.

  • Savaş says:

    Hocam Web servisleri rahatlıkla kullanabiliyorum teşekkür ederim. ama bir konuda sıkıntım var. Servisler bazen bakıma alınıyor ve ulaşılamıyor. Web Servis Çalışmıyorsa, Web Servis Kapalı ise Nasıl anlarım? Web servis kapalı olduğu zaman ekrana bir hata basacağım. bunu nasıl yapabilirim ? ilginiz için şimdiden teşekkür ederim.

  • Ersin says:

    Bunu sağlamak zor. Ama eğer servis aldığınız yer ile iletişim şansınız var ise. Servisin çalışır durumda olduğunu kontrol için bir protokol / yöntem oluşturabilirsiniz. Bunu yapma şansınız yoksa kodlarınızı try catch bloguna yazıp hata kontrolü ile servisin çalışıp çalışmadığını varsayabilirsiniz :

    1
    2
    3
    4
    5
    6
    $servis = new SoapClient('test.wsdl');
    try{
      $servis->test();
    }catch(Exception $e){
       echo 'servis kapalı';
    }

    Her soap çağrısı TCP protokolü ile bir sockete HTTP isteği olarak gider. Bu protokol gereği servis sunucusuna (sunucu socketine) bağlantı başarısız olduğunda belli bir süre bekler (timeout süresi). İşte yukarıdaki yöntemin dezavantajı , kodun timeout süresi kadar bekledikten sonra catch bloguna düşmesidir.

  • sengul says:

    ‘SoapClient’ not found demesinin sebebi nedir?

  • sengul says:

    php ile web servisi yazmak ve çalıştırmak için ne yapmam lazım yardım eder isiniz?

  • Ersin says:

    Sisteminizde SoapClient eklentisi etkinleştirilmemiş olmasından kaynaklanır. Ama php 5 de yüklü gekiyor normalde

  • Ersin says:

    Burda birkaç yazı paylaşmıştım bu konu ile ilgili, size bir fikir verebilir diye tahmin ediyorum.
    http://www.ersindogan.com/php-web-programlama/php-ile-web-servis-olusturmak bu yazıdan başlayabilirsiniz.

  • sengul says:

    Cok tesekkur ederim problemi çözdüm, fakat merak ettiğim şey neden string bir veri göderildiğinde ekranda string diye yazıyor ayrıca uzulungu.

  • Ersin says:

    Ne yaptığınız tam anlamadığımiçin birşey diyemeyeceğim. Büyük ihtimalle bir yerde var_dump unuttunuz.

  • eba says:

    selam
    öncelike paylaşımdan dolayı teşekkür ederim :)
    ben java netbeansta web service projesi yazmıştım daha önce ama şuan php üzerinde çalışıyorum … javada yazarken clienti oluşturabilmek için bir wsdl adresine ihtiyacımız vardı . web service sunucusunu çalıştırdıktan sonra açılan web sayfasından (WSDL FİLE) a tıklayıp adres çubuğundaki wsdl adresini alıp kullanabiliyordum. benim sorum php de bu wsdl adresini nasıl alacağımla ilgili. acaba çalışma prensibi aynı mı yine yoksa yukarıda da anlattığınız gibi wsdl adresini bizmi belirliyoruz eğer öyle ise biraz daha bahsedebilirmisiniz…. şimdiden teşekkürler.(Not: php ye netbeans üzerinde çalışıyorum).

  • eba says:

    yada javada yazdığım web service sunucusuna php den nasıl client yazacağım ….. :) :)

  • Ersin says:

    Php ile herhangi bir dilde yazdığınız web servisi kullanmak için SoapClient nesnesini kullanmanız yeterli.
    Örneğin :
    $client = new SoapClient(“http://sunucu.com/ornek.wsdl”);
    veya
    $client = new SoapClient(“http://sunucu.com/ornek.jsp?out=wsdl”);
    ister direkt bir wsdl dosyasını kullanın , isterseniz bir script üzerinden verin wsdli.

    Bundan sonra normal bir şekilde kullanabilirsiniz. Örneğin, web serivisinizde helloWorld diye bir metod olsun. Bunu kullanmak için
    $client = new SoapClient(“http://sunucu.com/ornek.wsdl”);
    $client->helloWorld();

    demeniz yeterli olacaktır.

  • eba says:

    teşekkür ederim ama :)
    (“http://sunucu.com/ornek.wsdl”); içindeki sunucu.com ne olacak ? ben javada deneme amaçlı basit bir web servis projesi açtım. benim wsdl adresim http://localhost:8080/WebApplication4/HelloWorld?WSDL şeklinde. geliba benim sorunum bu adresi nasıl kullanacağımı bilmiyor olmam.

  • Ersin says:

    $client=new SoapClient(“http://localhost:8080/WebApplication4/HelloWorld?WSDL”);

    biçiminde kullanmalısınız. WSDL adresi SoapClient nesnesi içerisine eklenmeli. Daha ayrıntılı bilgiyi http://php.net/soap adresinde bulabilirsiniz. Soap, PHP nin web servisi için kullandığı bir nesnedir.

RSS feed for comments on this post.


Yorum yaz

Powered by WordPress | conserio | xoppla | TheBuckmaker