PHP SOAP Kurulumu ve Kullanımı

PHP ile SOAP web servisinden veri çekmek için gerekli olan SOAP kurulumu ve SOAP kullanımı ile ilgili bilgiler yer almakta.

PHP SOAP nedir?

SOAP ile ilgili detaylı bilgi için SOAP Nedir? yazıma bakabilirsiniz.

PHP SOAP kurulumu

SOAP protokolünü kullanabilmek için PHP sürümünün en az 5.0 olması gerekir.

SOAP kurulumunu kontrol etmek için aşağıdaki komutları kullanabilirsiniz.

<?php

if (extension_loaded("soap")) {
    echo "SOAP kurulu.";
} else {
    echo "SOAP kurulu değil.";
}

?>

SOAP kurulu değilse aşağıdaki komut ile php.ini dosyasının yolunu bularak PHP sürümüne göre extension=soa, extension=php_soap ifadesinin önündeki noktalı virgülü kaldırarak etkinleştirebilirsiniz.

<?php

echo php_ini_loaded_file();

?>

SOAP kütüphanesini etkinleştirdikten sonra ayarların aktif olması için sunucu yazılımını yeniden başlatarak kurulumu tamamlayabilirsiniz.

PHP SOAP kullanımı

PHP içinde bulunan SOAP eklentisi, SOAP protokolüyle işlem yapmak için SoapClient, SoapServer, SoapFault gibi sınıflara sahiptir.

SOAP ile web servis oluştururken dikkat edilmesi gereken en önemli yer WSDL dosyasının hazırlanmasıdır.

PHP SOAP web servisi oluşturmak için WSDL dosyasına ihtiyaç duyar.

WSDL dosyası çeşitli WSDL sınıfları (NuSOAP, wsdl2phpgenerator, php2wsdl vb.) veya WSDL araçları kullanılarak oluşturulur.

<?xml version="1.0" encoding ="utf-8"?>
<definitions 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
    <!-- veri türleri tanımlanıyor -->
    <types>
      <schema xmlns="http://www.w3.org/2000/10/XMLSchema">
        <element name="kisi">
          <complexType>
            <all>
              <element name="value" type="string" />
            </all>
          </complexType>
        </element>
        <element name="void">
          <complexType>
            <sequence></sequence>
          </complexType>
        </element>
      </schema>
    </types>
    <!-- cevaplar tanımlanıyor -->
    <message name='returns_kisi'>
      <part name='kisi' type='xsd:kisi' />
    </message>
    <!-- istekler tanımlanıyor -->
    <message name='kisiler'>
      <part name='void' type='xsd:void' />
    </message>
    <!-- işlevler tanımlanıyor -->
    <portType name=''>
      <operation name='kisiler'>
        <input message='tns:kisiler' />
        <output message='tns:returns_kisi' />
      </operation>
    </portType>
    <!-- sunucu bilgileri tanımlanıyor -->
    <binding name='_webservices' type='tns:'>
      <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http' />
      <operation name='kisiler'>
        <soap:operation soapAction='urn:xmethods-delayed-quotes#kisiler' />
        <input>
        <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' />
        </input>
        <output>
          <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' />
        </output>
      </operation>
    </binding>
    <!-- sunucu bilgileri tanımlanıyor -->
    <service name=''>
      <port name='_0' binding='_webservices'>
        <soap:address location='http://localhost/sunucu.php' />
      </port>
    </service>
  </definitions>

SOAP web servisi hazırlarken WSDL dosyasındaki en önemli yerlerden birisi service etiketinde yer alan SOAP sunucu adresidir.

Adresin hatalı yazılması SOAP web servisinin çalışmamasına neden olacaktır.

WSDL dosyası hazırlandıktan sonra SoapServer sınıfını kullanarak SOAP web servisini aşağıdaki gibi oluşturabiliriz.

<?php

try {

    $server = new SoapServer('kisiler.wsdl');

    function kisiler()
    {
        return array('Yusuf SEZER', 'Ramazan SEZER', 'Sinan SEZER', 'Mehmet SEZER');
    }

    $server->addFunction('kisiler');

    $server->handle();

} catch (Exception $exc) {

    echo $exc->getMessage();

}

?>

SOAP web servisi oluşturmak için WSDL dosyası SoapServer sınıfına parametre olarak verilmiştir.

Ayrıca WSDL dosyası portType içindeki operation ile belirtilen kisiler fonksiyonu addFunction ile tanımlandıktan sonra handle metodu ile SOAP hazır hale getirilir.

PHP SOAP veri çekme

PHP ile herhangi bir SOAP web servisinden veri çekmek için WSDL dosyasına ait adresinin bilinmesi gerekir.

Yukarıda hazırlamış olduğumuz web servisi kullanmak için oluşturulan web servis adresinin son ekine ?WSDL eklemek yeterli olacaktır.

<?php

try {

    $istek = new SoapClient('http://localhost/sunucu.php?WSDL');

    print_r($istek->kisiler());

} catch (Exception $exc) {

    echo $exc->getMessage();
}

?>

Web servis adresi yerine oluşturulan WSDL dosyası da kullanılabilir.

<?php

try {

    $istek = new SoapClient('kisiler.wsdl');

    print_r($istek->kisiler());

} catch (Exception $exc) {

    echo $exc->getMessage();
}

?>

Örnekte SOAP web servisine erişmek için SoapClient sınıfı kullanılmıştır.

Sınıf SOAP sunucusuna erişerek kisiler işlevini çalıştırıp sonucunu yazdıracaktır.

SOAP web servisi ile ilgili bilgi almak için SoapClient sınıfındaki çeşitli metotlar kullanılır.

SOAP sunucusundaki fonksiyonları almak için __getFunctions metodu, veri tiplerini almak için __getTypes metodu kullanılır.

Gönderilen istek ve cevap ile ilgili bilgi almak için __getLastRequest, __getLastRequestHeaders, __getLastResponse, ve __getLastResponseHeaders metotları kullanılır.

<?php

try {

    $istek = new SoapClient('http://localhost/sunucu.php?WSDL');

    print_r($istek->__getFunctions());

    echo "<hr />";

    print_r($istek->__getTypes());

    echo "<hr />";

} catch (Exception $exc) {

    echo $exc->getMessage();
}

?>

TC kimlik sorgulama ve doğrulama işlemi için https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx adresinde yer alan SOAP web servisi kullanılabilir.

SOAP kullanımı yukarıdaki örneğe benzer şekilde WSDL adresinin parametre olarak yazılması yeterli olacaktır.

<?php

try {

    $istek = new SoapClient('https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL');

    print_r($istek->__getFunctions());

    echo "<hr />";

    print_r($istek->__getTypes());

    echo "<hr />";
    
} catch (Exception $exc) {

    echo $exc->getMessage();
}

?>

SOAP servisi içindeki gerekli işlev ve parametrelerle ilgili bilgiler alındıktan sonra web servis kullanılabilir.

<?php

try {

    $istek = new SoapClient('https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL');

    $sonuc = $istek->TCKimlikNoDogrula(array(
        'TCKimlikNo' => 11111111111,
        'Ad' => 'YUSUF',
        'Soyad' => 'SEZER',
        'DogumYili' => 1111)
    );

    if ($sonuc->TCKimlikNoDogrulaResult) {
        echo "Bilgiler doğru";
    } else {
        echo "Bilgiler hatalı";
    }

} catch (Exception $exc) {

    echo $exc->getMessage();
}

?>

PHP ile SOAP web servislerini örneklerde olduğu gibi kolay bir şekilde kullanabilirsiniz.

Web Servis Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!