PL/SQL WEB SERVICE (UTL_HTTP) İLE VERİ ÇEKMEK
Bu yazımda PL/SQL kullanarak bir Web Service’den nasıl veri çekebileceğimizi inceleyeceğim. Oracle veritabanı üzerinden dış kaynaklara talep gönderebilmek için UTL_HTTP paketi kullanılmalıdır. Bu yazıda örnek Web Service olarak e-posta doğrulayan bir Web Service kullanılacaktır. Web Service Link: http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx?wsdl
Kodumuzun başında kod içersinde kullacağımız lokal değerleri tanımlama ve gerekiyorsa değer atama işlemini yapmalıyız. Bu noktada iki adet UTL_HTTP paket değerine ihtiyacımız vardır. UTL_HTTP.REQ talep göndermek için kullanacağımız paket değeri iken, UTL_HTTP.RESP ise Web Service’ten talep ettiğimizde bize dönen XML cevabı almak için kullanacağımız değerdir.
REQUEST_ENV talep gönderme durumunda kullanılan parametreli SOAP zarfı için kullanılacaktır. RESPONSE_ENV ise dönen cevabı içermektedir. Bu dönen cevabı daha sonradan CLOB tipine dönüştürüp, CLOB_RESPONSE içine koyacağız.
1 2 3 4 5 6 7 8 9 10 |
DECLARE HTTP_REQ UTL_HTTP.REQ; HTTP_RESP UTL_HTTP.RESP; REQUEST_ENV VARCHAR2(32767); RESPONSE_ENV VARCHAR2(32767); CLOB_RESPONSE CLOB; L_EMAIL VARCHAR2(120); |
Program başladığında CLOB alanı kullanabilmemiz için geçici büyük obje alanı yaratmamız gerekmektedir. Bunun için aşağıdaki kod parçası kullanılır.
1 2 3 |
DBMS_LOB.CREATETEMPORARY(CLOB_RESPONSE, FALSE); |
REQUEST_ENV içerisine ilgili SOAP zarfını yerleştirdikten sonra, UTL_HTTP paketi içerisindeki BEGIN_REQUEST fonksiyonunu kullanarak ilgili WSDL linkinden talebi başlatıyoruz. Talep başladıktan sonra varsa OPTIONAL olarak başlık bilgilerini giriyoruz. UTL_HTTP.WRITE_TEXT ile talebi UTL_HTTP paketinden oluşturduğumuz HTTP_REQ içine yazıyoruz.
UTL_HTTP.GET_RESPONSE ile de Web Service’e gönderdiğimiz zarfın cevabını alıyoruz. İlk aşamada cevabı RESP değerine atıyoruz. Daha sonradan içersindeki text’i (XML) CLOB olarak ayıklıyoruz.
Bütün Kod;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
DECLARE HTTP_REQ UTL_HTTP.REQ; HTTP_RESP UTL_HTTP.RESP; REQUEST_ENV VARCHAR2(32767); RESPONSE_ENV VARCHAR2(32767); CLOB_RESPONSE CLOB; L_EMAIL VARCHAR2(120) := 'altunkan@gmail.com'; BEGIN DBMS_LOB.CREATETEMPORARY(CLOB_RESPONSE, FALSE); REQUEST_ENV:= '<!--?xml version="1.0" encoding="utf-8"?--> '||l_email||' '; HTTP_REQ := SYS.UTL_HTTP.BEGIN_REQUEST('http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx?wsdl', 'POST', UTL_HTTP.HTTP_VERSION_1_1); UTL_HTTP.SET_HEADER(HTTP_REQ, 'Content-Type', 'text/xml; charset=utf-8'); UTL_HTTP.SET_HEADER(HTTP_REQ, 'Content-Length', LENGTH(REQUEST_ENV)); UTL_HTTP.WRITE_TEXT(HTTP_REQ, REQUEST_ENV); HTTP_RESP := UTL_HTTP.GET_RESPONSE(HTTP_REQ); DBMS_OUTPUT.PUT_LINE('Response Received'); DBMS_OUTPUT.PUT_LINE('--------------------------'); DBMS_OUTPUT.PUT_LINE ( 'Status code: ' || HTTP_RESP.STATUS_CODE ); DBMS_OUTPUT.PUT_LINE ( 'Reason phrase: ' || HTTP_RESP.REASON_PHRASE ); BEGIN LOOP UTL_HTTP.READ_TEXT(HTTP_RESP, RESPONSE_ENV); DBMS_LOB.WRITEAPPEND (CLOB_RESPONSE, LENGTH(RESPONSE_ENV), RESPONSE_ENV); END LOOP; EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(HTTP_RESP); INSERT INTO HR.XX_WS_CEVAP VALUES ('TEST', CLOB_RESPONSE, SYSDATE); COMMIT; END; END; |