• PHP SOAP WSDL - Servis oluşturma

0

SOAP (Simple Object Access Protocol)

Web servisleri Haziran 2000’de ortaya çıkan bir çok yazılım firması tarafından yoğun bir destek bulan bir modeldir. Web servisleri açık internet standartlarına dayanır. Henüz gelişme ve olgunlaşma aşamasında olan bu modelle ilgili olarak bu aşamada ortaya çıkan ve kullanılan çekirdek standartlar SOAP, WSDL ve UDDI’dır. Web servisleri anlayabilmeniz için öncelikle HTML ve XML dillerinin temelini anlamanız gerekiyor.

Peki ama web servis nerelerde kullanılıyor?

  • Web Servisler uygulama bileşenidir
  • Web Servisler açık protokolleri(open protocols) kullanarak haberleşir.
  • Web Servisler kendi kendine yetebilen ve kendinden tanımlıdırlar.
  • Web Servisler UDDI kullanılarak keşfedilebilir.
  • Web Servisler diğer uygulamalar tarafından kullanılabilir.
  • Web Servisler XML temeline dayanır yani XML tabanlı bir teknolojidir.

Bir web servisi istemcisinin bir servis sağlayıcıdan bir servisi çağırma aşamasındaki temel adımları:

  • Web servisi istemcisi (SOAP Client) servis kayıt biriminden (UDDI) web servisini bulur.
  • İstemci bir SOAP mesajı hazırlar. SOAP mesajı bir XML belgesidir.
  • İstemci SOAP mesajını web server veya uygulama sunucusunda çalışan SOAP istek dinleyicisine gönderir. İstek dinleyici gelen isteklere cevap veren sunucu programlardır. Bu programlar bir JSP, ASP, CGI veya ISAPI programıdır.
  • SOAP sunucu gelen SOAP mesajını parse eder ve gerekli parametreleri göndererek istenen nesnenin istenen yöntemini çağırır.
  • Çağırılan nesnedeki yöntem çalışır ve sonuçları SOAP sunucuna’a gönderir. SOAP sunucusu gelen sonucu SOAP mesajı formatında biçimlendirerek istemciye gönderir.
  • İstemci gelen SOAP mesajının içindeki bilgileri alarak istekde bulunan programa gönderir.

SOAP, XML tabanlı uygulamalarda HTTP üzerinden bilgi değişimine izin veren protokoldür. Basitçe SOAP, Web Servis erişimi için protokoldür. RPC (Remote Procedure Call, DCOM, IIOP (Internet Inter-ORB Protocol) ve Java RMI bu çözümlerden bazılarıdır.

  • SOAP, mesaj göndermek için bir formattır.
  • SOAP, Internet üzerinden iletişim kurmak amacıyla tasarlanmıştır.
  • SOAP, platformdan ve programlama dilinden bağımsızdır.
  • SOAP, firewall(güvenlik duvarına) gelebilmeye izin verir.
  • SOAP W3C standardıdır.

WSDL(Web Services Description Language):

WSDL, XML tabanlı web servisleri tanımlamak ve yerini belirtmek için tanımlanmış dildir. WSDL, W3C standardıdır. Bir anlamda dağıtık programlamada kullanılan IDL’e (Interface Definition Language – Arayüz Tanımlama Dili) benzer. Web servisi tanımı işlemler, giren ve çıkan mesaj formatları, ağ ve port adresleri gibi bilgileri tanımlar. Bir web servisi tanım belgesi aşağıdaki temel elemanları içerir:

  • Types (Tipler): mesajlarda kullanılacak veri tiplerini belirtir.
  • Message (Mesajlar): İletişimde kullanılacak measjları tanımlar.
  • PortType (Port Tipi): Web servisinin içerdiği işlemleri (methods) ve ilgili mesajları tanımlar.
  • Binding (Bağlama): İşlem ve mesajlarda kullanılacak veri formatlarını tanımlar.
  • Port: Binding ve web adresinden oluşan servis noktasını tanımlar. Web adresi servisin çalıştırılacağı URL’dir.
  • Service: Kullanılan port’lar kümesidir.

test.wsdl

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
xmlns:y="http://example.org/math/" 
xmlns:ns="http://example.org/math/types/" 
targetNamespace="http://example.org/math/"
>
    <types>
        <xs:schema targetNamespace="http://example.org/math/types/" xmlns="http://example.org/math/types/"  elementFormDefault="unqualified" attributeFormDefault="unqualified">

            <xs:complexType name="UyeGirisiIstekTipGirisi">
                <xs:sequence>
                    <xs:element minOccurs="0" maxOccurs="1" name="kullanici" type="xs:string"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="sifre" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="UyeGirisiIstekTipCikisi">
                <xs:sequence>
                    <xs:element name="sonuc" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="KayitOlIstekTipGirisi">
                <xs:sequence>
                    <xs:element minOccurs="0" maxOccurs="1" name="kullanici" type="xs:string"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="sifre" type="xs:string"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="eposta" type="xs:string"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="adsoyad" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="KayitOlIstekTipCikisi">
                <xs:sequence>
                    <xs:element name="sonuc" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

            <xs:element name="UyeGirisi" type="UyeGirisiIstekTipGirisi"/>
            <xs:element name="KayitOl" type="KayitOlIstekTipGirisi"/>

            <xs:element name="UyeGirisiIstek" type="UyeGirisiIstekTipCikisi"/>
            <xs:element name="KayitOlIstek" type="KayitOlIstekTipCikisi"/>

        </xs:schema>
    </types>

    <message name="UyeGirisiMesaj">
        <part name="parameters" element="ns:UyeGirisi"/>
    </message>

    <message name="UyeGirisiMesajSonuc">
        <part name="parameters" element="ns:UyeGirisiIstek"/>
    </message>

    <message name="KayitOlMesaj">
        <part name="parameters" element="ns:KayitOl"/>
    </message>

    <message name="KayitOlMesajSonuc">
        <part name="parameters" element="ns:KayitOlIstek"/>
    </message>

    <portType name="MathInterface">

        <operation name="UyeGirisi">
            <input message="y:UyeGirisiMesaj"/>
            <output message="y:UyeGirisiMesajSonuc"/>
        </operation>

        <operation name="KayitOl">
            <input message="y:KayitOlMesaj"/>
            <output message="y:KayitOlMesajSonuc"/>
        </operation>

    </portType>

<binding name="HesapHttpBinding" type="y:MathInterface">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <operation name="UyeGirisi">
        <soap:operation soapAction="http://localhost/soapserver.php#UyeGirisi"/>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>

    <operation name="KayitOl">
        <soap:operation soapAction="http://localhost/soapserver.php#KayitOl"/>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>

</binding>

<service name="HesapService">
    <port name="HesapEndpoint" binding="y:HesapHttpBinding">
        <soap:address location="http://localhost/soapserver.php"/>
    </port>
</service>

</definitions>

soapserver.php

<?php
header('Access-Control-Allow-Origin: *');
header('Content-Type: text/html; charset=UTF-8');
class Service{

    public $username = 'root';
    public $password = '123';

    public function __construct(){
        header('WWW-Authenticate: Basic realm="SOAP Security"');
        header('HTTP/1.0 401 Unauthorized');
        if($_SERVER['PHP_AUTH_USER'] != $this->username):
            exit("Unauthorized");
        elseif($_SERVER['PHP_AUTH_PW'] != $this->password):
            exit("Unauthorized");
        else:
            return true;
        endif;
    }

    public function UyeGirisi($kullanici, $sifre){
        return array("UyeGirisiResult", array($kullanici,$sifre));
    }

}

$client = new Service();
$server = new SoapServer(null, array('uri' => "http://localhost/test.wsdl"));
$server->setObject($client);
$data = file_get_contents('php://input');
$server->handle($data);
?>

client.php

<?php
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache',0);
ini_set('soap.wsdl_cache_ttl',0);

$client = new SoapClient(
    'http://localhost/test.wsdl',
    array(
        "trace"        => 1,
        "exception"    => 0,
        "soap_version" => SOAP_1_1,
        "encoding"     => "UTF-8",
        "cache_wsdl"   => WSDL_CACHE_NONE ,
        "login"        => 'root',
        "password"     => '123'
    )
);    

echo print_r($client->__getFunctions());
echo print_r($client->__getTypes());

try{

    $client->__soapCall("UyeGirisi",
        array('parameters' =>
            array(
                'kullanici' => 'ramazan',
                'sifre' => 'sahin'
            )
        )
    );

    echo print_r($client->__getLastRequest());
    echo print_r($client->__getLastRequestHeaders());

    echo print_r($client->__getLastResponse());
    echo print_r($client->__getLastResponseHeaders());
}catch(SoapFault $e){
    echo print_r($e);
}
?>

  • Cevaplar

  • Senin Cevabın


Adı ve soyadı * Misafir olarak cevap yazabilirsiniz.
E-Posta *
 

Cevap Bekleyen Sorular

Sıcak Tartışmalar

Popüler Etiketler

Faydalı Kaynaklar