Sunuyu indir
1
Web Service Uygulaması
Temel Web Service özellikleri ve Oracle PL/SQL ile web servis çağırmak. Ümit Varol / Diveya Bilgi Sistemleri 04/12/ İstanbul
2
Web Servis Nedir? Web servisler, web teknolojisi üzerinde çalışan veri yayınlama ve veri toplama araçlarıdır. Web servisler, açık protokolleri kullanır ve çok temel olarak XML ve HMTL yapılarıyla çalışır. Web servisler, herhangi bir uygulamanızı internet tabanlı bir uygulamaya dönüştürür ve herhangi bir uygulamanın, sizin uygulamanıza internet üzerinden ulaşmasını sağlar. XML yapısında oluşturulan sorular ve cevaplar ile çalışır. Public Internet SOAP XML f(x) XML Service Requester Service Provider İstanbul'10 20 Mayıs 2010
3
İçerik Web Servis nedir, nasıl çalışır ? Örnek Web Servis senaryosu.
Web Servis Response ve Request mesajlarının yapısı. Örnek Kod. UTL_HTTP nedir, nasıl çalışır. Örnek Web Servis senaryosu, devam! PL/SQL Örnek Kod. Notlar. İstanbul'10 20 Mayıs 2010
4
Neden Web Servis? Birlikte çalışabilirliği çok yüksektir.
Her platformda ve en az kaynakla üretilmesi ve bakım desteği mümkündür. Web servisler çok yaygın olarak bilinen açık protokollerini kullanır, veriyi paketlemek için XML, taşımak için SOAP gibi. Web servisleri kullanarak, uygulamanız içindeki fonksiyonlarınızı veya uygulamanızda ürettiğiniz mesajlarınızı dünyanın geri kalanına yayınlayabilirsiniz. Çok çeşitli uygulamalar geliştirebilirsiniz. (Bilet Sorgulama, İlk 10 listesi, Sipariş Alma, Anında Tercüme gibi) Farklı ortamlardaki, tamamen birbirinden farklı yapıdaki sistemlerin veri paylaşımı için ideal bir iletişim aracıdır. Bu nedenle son zamanlarda en çok kullanılan entegrasyon biçimidir. İstanbul'10 20 Mayıs 2010
5
Web Service Nasıl Çalışır?
Web hizmetleri platformu elemanları: SOAP (Simple Object Access Protocol, Basit Nesne Erişim Protokolü) WSDL (Web Services Description Language, Web Servis Tanımlama Dili) UDDI (Universal Description, Discovery and Integration, Evrensel Tanım, Keşif ve Entegrasyon) UDDI Service Broker WSDL WSDL Public Internet SOAP XML f(x) XML Service Requester Service Provider İstanbul'10 20 Mayıs 2010
6
SOAP Nedir? Simple Object Access Protocol, Basit Nesne Erişim Protokolü SOAP, HTTP üzerinden bilgi paylaşımı için kullanılan XML tabanlı bir protokoldür. Ya da kısaca, web servislere bağlanmak için kullanılan protokoldür. Çok özetle SOAP, bir iletişim protokolüdür. İnternet üzerinden iletişim kurmak için tasarlanmıştır. Kolay kullanılabilir bir mesaj gönderme yöntemidir. Hem platform bağımsız hem de dil bağımsızdır. SOAP, XML tabanlıdır, basittir ve genişletilebilir. SOAP ile firewall sorununuz en azdır. SOAP bir W3C standardıdır. Daha detaylı bilgi için W3C’nin sitesini ziyaret edebilirsiniz. İstanbul'10 20 Mayıs 2010
7
SOAP Nedir? Herhangi bir SOAP mesajının 3 temel elemanı vardır :
Envelope Header (Zorunlu değil) Body Temel olarak bir SOAP mesajı 3 şekilde oluşabilir : Metod Çağırımı Cevap Mesajı Hata Mesajı Metod çağırma mesajı da temel olarak 2 amaçla kullanılabilir : Get : Bilgi almak için Set : Bilgi göndermek için SOAP : ENVELOPE SOAP : HEADER SOAP : BODY İstanbul'10 20 Mayıs 2010
8
WSDL nedir? Web Services Description Language, Web Servis Tanımlama Dili WSDL, web servisleri tanımlamak için kullanılan XML tabanlı bir dildir. WSDL, web servislerin içeriğini tanıtır. WSDL, web servislerin bulunmasını sağlar. Bir çok uygulama geliştirme ortamı tarafından otomatik algılanır. WSDL bir W3C standardıdır. Daha detaylı bilgi için W3C’nin sitesini ziyaret edebilirsiniz. İstanbul'10 20 Mayıs 2010
9
UDDI nedir? Universal Description, Discovery and Integration
Evrensel Tanım, Keşif ve Entegrasyon UDDI, kurumların web servislerini kaydettikleri ve başka web servisleri aradıkları bir dizin servisidir. UDDI, web servisler hakkında bilgilerin bulunduğu bir dizindir. UDDI, web servislerin WSDL tanımlama arayüzlerinin bulunduğu bir dizindir. UDDI, SOAP aracılığı ile çalışır. UDDI servisi Microsoft .NET platformu içindedir. Daha detaylı bilgi için W3C’nin WSDL sitesini ziyaret edebilirsiniz. İstanbul'10 20 Mayıs 2010
10
Örnek Senaryo Çağıracağımız web servisin URL tanıtım adresi ile açıklama sayfasına veya WSDL dosyasına ulaşabiliriz. Elde ettiğimiz WSDL ile kendi uygulamamızı otomatik veya kendimiz geliştirebiliriz. Uygulamamız HTTP erişimine olanaklı yazılım ve ağ altyapısında olmalıdır. Çağrılacak metoda uygun XML formatında talep mesajı gönderilmelidir. Gelen XML formatındaki cevap çözümlenerek işlenebilir. 1 Application URL Application WSDL 2 SOAP ENVELOPE Public Internet SOAP BODY Request 4 3 SOAP ENVELOPE f(x) f(x) 5 SOAP BODY Response Service Requester Service Provider İstanbul'10 20 Mayıs 2010
11
Örnek Kod / Response Çağıracağımız web servisi sağlayacak kurumdan elde ettiğimiz URL ile bir web tarayıcısından ilgili sayfaya ulaşarak aldığımız bilgi aşağıdaki gibi olabilir. POST /ws_DEMO/ws_DEMO.asmx HTTP/1.1 Host: Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: " Bu servis “POST” metodu ile istekte bulunulacak ve “HTTP/1.1” standardı ile haberleşilecektir. Web servis, ilgili domain altında “/ws_DEMO/ws_DEMO.asmx” adresinde bulunmaktadır. Web servisinin bulunduğu sunucu “ ” adresindedir. Web servisi içinde SOAP standardına uygun olarak istekte bulunulacak fonksiyonun adresi ise " şeklindedir. Son olarak göndereceğimiz mesajın uzunluğuda “length” bilgisi ile bildirilmelidir. SOAP ENVELOPE SOAP BODY Request “URL Header” bilgileri İstanbul'10 20 Mayıs 2010
12
Örnek Kod / Response Çağıracağımız web servisi sağlayacak kurumdan elde ettiğimiz URL ile bir web tarayıcısından ilgili sayfaya ulaşarak aldığımız bilgi aşağıdaki gibi olabilir. <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi=" xmlns:xsd=" xmlns:soap=" <soap:Body> <DEMO_Siparis_FNC xmlns=" <siparis_no>int</siparis_no> <siparis_tarihi>string</siparis_tarihi> <kalem_kodu>string</kalem_kodu> <siparis_adedi>int</siparis_adedi> </DEMO_Siparis_FNC> </soap:Body> </soap:Envelope> SOAP ENVELOPE SOAP BODY Request f(x) İstanbul'10 20 Mayıs 2010
13
Örnek Kod / Request Çağıracağımız web servisi sağlayacak kurumdan elde ettiğimiz URL ile bir web tarayıcısından ilgili sayfaya ulaşarak aldığımız bilgi aşağıdaki gibi olabilir. HTTP/ OK Content-Type: text/xml; charset=utf-8 Content-Length: length Bir URL request gönderdiğimiz için mutlaka bir URL request oluşacaktır. İstekte bulunacağımız Web servise gelecek cevap yine “HTTP/1.1” standardında olacaktır. Gelen cevapla birlikte, web sunucusunun geri döndürdüğü bir durum kodu olacaktır. Bu durum kodu yine genel bir standart olarak eğer “200” ise web sunucusundan sağlıklı olarak cevap dönmüş demektir. Buradan dönen 200 değeri, sadece sağlıklı bir cevap alacağınız anlamına gelir, çağrılan Web servis ile yapılmak istenen işlemin neticesini gösteren bir cevap değildir. Web servis ile yapılan işlem neticesinde oluşan cevap ise alacağınız mesajın içerisinde gelecektir. Web servisin sağlıklı cevap vermemesi durumunda ise genellikle 500 değeri döner, bunun dışında da muhtelif, bir çok hata kodu bulunmaktadır. SOAP ENVELOPE “URL Header” bilgileri SOAP BODY Response İstanbul'10 20 Mayıs 2010
14
Örnek Kod / Request Çağıracağımız web servisi sağlayacak kurumdan elde ettiğimiz URL ile bir web tarayıcısından ilgili sayfaya ulaşarak aldığımız bilgi aşağıdaki gibi olabilir. <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi=" xmlns:xsd=" xmlns:soap=" <soap:Body> <DEMO_Siparis_FNCResponse xmlns=" <DEMO_Siparis_FNCResult>string</DEMO_Siparis_FNCResult> </DEMO_Siparis_FNCResponse> </soap:Body> </soap:Envelope> SOAP ENVELOPE SOAP BODY Response f(x) İstanbul'10 20 Mayıs 2010
15
Örnek Kod / Request Web servisin sorunsuz olarak çalıştığı ve bir cevap ürettiği durumda, size dönecek cevap aşağıdaki gibi olacaktır. <soap:Body> <DEMO_Siparis_FNCResponse xmlns=" <DEMO_Siparis_FNCResult>string</DEMO_Siparis_FNCResult> </DEMO_Siparis_FNCResponse> </soap:Body> Web servisin olası bir hata veya geçersiz parametreden kaynaklı olarak hata ile tamamlanması durumda ise size dönecek cevap aşağıdaki gibi olacaktır. Bu noktadan sonra yapılması gereken, gelen cevabı bir XML Parser ile çözerek elde edeceğiniz cevabı yorumlamaktır. SOAP ENVELOPE SOAP BODY Response İstanbul'10 20 Mayıs 2010
16
UTL_HTTP Nedir? HTTP – Hyper Text Markup Language, Zengin Metin İşaretleme Dili HTML aracılığıyla PL/SQL’den dış ortamlara ulaşmayı sağlar. Bu paket ile internet üzerinden farklı sistemler üzerindeki verilere erişebilirsiniz. Bu paket ayrıca HTTPS olarak da bilinen HTTP üzerinden SSL, Secure Socket Layer protokolünüde desteklemektedir. Bu paket ile doğrudan veya HTTP proxy üzerinden bir web sayfasına bağlanabilirsiniz. Standart Oracle kütüphanesidir (7.3.4’den itibaren) [ORACLE_HOME] / rdbms / admin / utlhttp.sql İstanbul'10 20 Mayıs 2010
17
UTL_HTTP Nasıl Çalışır?
UTL_HTTP paketi ile doğrudan bir web sitesine ulaşmanın iki basit yolu vardır. UTL_HTTP.Request Bu fonksiyon tüm web sitesini tek bir String olarak döndürür. declare t_result varchar2(4000); begin t_result := utl_http.request(' -- t_result ile istediğiniz işlemi yapın end; UTL_HTTP.Request_Lines Bu fonksiyon ise web sitesini bir PL/SQL tablosu gibi döndürür. declare t_part utl_http.html_pieces; begin t_part := utl_http.request_lines(' for i in 1 .. t_part.count loop -- t_part(i) ile istediğiniz işlemi yapın; end loop; İstanbul'10 20 Mayıs 2010
18
UTL_HTTP Nasıl Çalışır?
UTL_HTTP paketinin temel akış şeması: Request Response İstanbul'10 20 Mayıs 2010
19
UTL_HTTP Nasıl Çalışır?
UTL_HTTP paketi ile bir URL’den HTTP ile istekte bulunmak için, Request Begin_Request( url IN VARCHAR2, method IN VARCHAR2 DEFAULT 'GET', http_version IN VARCHAR2 DEFAULT NULL) RETURN HTTP_Request_Type; Set_Header( req IN OUT NOCOPY HTTP_Request_Type, name IN VARCHAR2, value IN VARCHAR2 DEFAULT NULL ); Write_Text( req IN OUT NOCOPY HTTP_Request_Type, data IN VARCHAR2 CHARACTER SET ANY_CS ); End_Request (req IN OUT NOCOPY HTTP_Request_Type); Response Get_Response( req IN OUT NOCOPY HTTP_Request_Type, return_info_response IN BOOLEAN DEFAULT FALSE) RETURN HTTP_Response_Type; Read_Text( resp IN OUT NOCOPY HTTP_Response_Type, data OUT NOCOPY VARCHAR2 CHARACTER SET ANY_CS, len IN PLS_INTEGER DEFAULT NULL ); End_Response (resp IN OUT NOCOPY HTTP_Response_Type); f(x) SOAP ENVELOPE SOAP BODY Request f(x) SOAP ENVELOPE SOAP BODY Response İstanbul'10 20 Mayıs 2010
20
Örnek Senaryo, Devam! f(x) f(x) f(x)
Çağıracağımız web servis için gereken parametreleri içeren bir fonksiyon ile içeriği oluşturabiliriz. Oluşturduğumuz içeriği XML formatında düzenleyerek bir String değişken içine atabiliriz. Oluşturduğumuz XML talep mesajını iletmek için bir SOAP Envelope oluşturmalıyız. Artık mesajımızı karşı tarafa gönderebiliriz. Application Application Public Internet URL SOAP ENVELOPE f(x) 1 SOAP BODY Request SOAP ENVELOPE Service Requester f(x) 2 SOAP BODY Response Service Provider f(x) İstanbul'10 20 Mayıs 2010
21
Örnek Senaryo, Devam! f(x) f(x) İstanbul'10 Application Application
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi=" xmlns:xsd=" xmlns:soap=" <soap:Body> <DEMO_Siparis_FNC xmlns=" <siparis_no>int</siparis_no> <siparis_tarihi>string</siparis_tarihi> </DEMO_Siparis_FNC> </soap:Body> </soap:Envelope> Application Application Public Internet URL SOAP ENVELOPE f(x) 1 SOAP BODY Request Service Requester f(x) Service Provider SOAP ENVELOPE Declare l_envelope_req VARCHAR2(1000); SOAP BODY Request İstanbul'10 20 Mayıs 2010
22
UTL_HTTP ile Request! UTL_HTTP paketi ile bir URL’den HTTP ile istekte bulunmak için, Request Begin_Request( url IN VARCHAR2, method IN VARCHAR2 DEFAULT 'GET', http_version IN VARCHAR2 DEFAULT NULL) RETURN HTTP_Request_Type; l_httl_request := UTL_HTTP.Begin_Request( ‘ , ’POST’ , ’HTTP/1.1’ ); Set_Header( req IN OUT NOCOPY HTTP_Request_Type, name IN VARCHAR2, value IN VARCHAR2 DEFAULT NULL ); UTL_HTTP.set_header( l_httl_request, 'Content-Type', 'text/xml; charset=utf-8'); UTL_HTTP.set_header( l_httl_request, 'Content-Length', LENGTH( l_envelope_req )); UTL_HTTP.set_header( l_httl_request, 'SOAPAction', ' Write_Text( req IN OUT NOCOPY HTTP_Request_Type, data IN VARCHAR2 CHARACTER SET ANY_CS ); UTL_HTTP.write_text( l_httl_request, l_envelope_req ); İstanbul'10 20 Mayıs 2010
23
Örnek Senaryo, Devam! f(x) f(x) İstanbul'10 Application Application
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi=" xmlns:xsd=" xmlns:soap=" <soap:Body> <DEMO_Siparis_FNCResponse xmlns=" <DEMO_Siparis_FNCResult>string</DEMO_Siparis_FNCResult> </DEMO_Siparis_FNCResponse> </soap:Body> </soap:Envelope> Application Application Public Internet f(x) SOAP ENVELOPE Service Requester f(x) 2 SOAP BODY” Response Service Provider SOAP ENVELOPE Declare l_envelope_resp VARCHAR2(1000); SOAP BODY” Response İstanbul'10 20 Mayıs 2010
24
UTL_HTTP ile Response! UTL_HTTP paketi ile isteğimize verilen cevabı PL/SQL ortamında almak, Response Get_Response(req IN OUT NOCOPY HTTP_Request_Type, return_info_response IN BOOLEAN DEFAULT FALSE) RETURN HTTP_Response_Type; l_http_response := UTL_HTTP.get_response( l_httl_request ); Read_Text(resp IN OUT NOCOPY HTTP_Response_Type, data OUT NOCOPY VARCHAR2 CHARACTER SET ANY_CS, len IN PLS_INTEGER DEFAULT NULL ) UTL_HTTP.read_text ( l_http_response, l_envelope_resp); End_Response(resp IN OUT NOCOPY HTTP_Response_Type) UTL_HTTP.end_response( l_http_response); HTTP Status Kontrolü (200, 500, vs..) stcd := l_http_response.status_code İstanbul'10 20 Mayıs 2010
25
Örnek Senaryo, Devam! Elde ettiğimiz XML formatındaki cevabı çözümlemek için aşağıdaki gibi bir çalışma yapabiliriz. l_response := XMLTYPE.createxml( l_envelope_resp); l_response := l_response.extract ('/Soap:Envelope/Soap:Body/child::node()', 'xmlns:Soap=" l_http_st_code := l_http_response.status_code; if l_http_st_code = 200 then DBMS_OUTPUT.put_line(‘Servis Başarı ile Çağrıldı.’); DBMS_OUTPUT.put_line(l_response.getstringval()); elsif l_http_st_code = 500 then DBMS_OUTPUT.put_line(‘Servis Cevap Döndüremedi.’); else DBMS_OUTPUT.put_line(‘Servise Ulaşılamadı!’); end if; SOAP ENVELOPE XML Declare l_response VARCHAR2(1000); SOAP BODY” Response İstanbul'10 20 Mayıs 2010
26
Kodlara Genel Bakış İstanbul'10 Declare
l_envelope_resp VARCHAR2(32767); l_envelope_req VARCHAR2(32767); l_httl_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_response XMLTYPE; l_http_st_code VARCHAR2(10); Begin l_httl_request := UTL_HTTP.Begin_Request( ‘ , ’POST’ , ’HTTP/1.1’ ); UTL_HTTP.set_header( l_httl_request, 'Content-Type', 'text/xml; charset=utf-8'); UTL_HTTP.set_header( l_httl_request, 'Content-Length', LENGTH( l_envelope_req )); UTL_HTTP.set_header( l_httl_request, 'SOAPAction', ' UTL_HTTP.write_text( l_httl_request, l_envelope_req ); l_http_response := UTL_HTTP.get_response( l_httl_request ); UTL_HTTP.read_text ( l_http_response, l_envelope_resp); UTL_HTTP.end_response( l_http_response); l_response := XMLTYPE.createxml( l_envelope_resp); l_response := l_response.extract ('/Soap:Envelope/Soap:Body/child::node()', 'xmlns:Soap=" l_http_st_code := l_http_response.status_code; if l_http_st_code = 200 then DBMS_OUTPUT.put_line(‘Servis Başarı ile Çağrıldı.’); DBMS_OUTPUT.put_line(l_response.getstringval()); elsif l_http_st_code = 500 then DBMS_OUTPUT.put_line(‘Servis Cevap Döndüremedi.’); else DBMS_OUTPUT.put_line(‘Servise Ulaşılamadı!’); end if; End; İstanbul'10 20 Mayıs 2010
27
Notlar UTL_HTTP 45 adet fonksiyon içeren bir pakettir. Diğer özelliklerinide incelemek faydalı olacaktır. XMLTYPE Oracle tarafından sunulan ve XML verileri işlemeyi kolaylaştıran geliştirilmiş bir veri tipidir. Veri içeriğinin bazı fonksiyonlar yardımı ile kullanımına olanak sağlar. HTML Status kodları ile ilgili W3.org sitesinden, VARCHAR2 tipinin PL/SQL içindeki boyutu byte olabilmekle birlikte veritabanında sadece 4000 byte olabiliyor. Bu detaya dikkat etmek faydalı olacaktır. İstanbul'10 20 Mayıs 2010
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.