Bir SOAP servisini WSDL olmadan, ya da WSDL ile çağırmak
Harici bir sisteme veri göndermeniz ya da bir web servisinden veri çekmeniz gerektiğinde TROIA size iki yol sunuyor: ham bir HTTP POST atmak, ya da bir WSDL tanımını kullanıp servisi doğrudan operasyon adıyla çağırmak. Hangisini seçeceğiniz, karşı tarafın ne sunduğuna bağlı.
Ham HTTP POST: SENDHTTPPOST
SENDHTTPPOST {postmetni} TO {url}
[CODEPAGE {kodlama}] [CONTENTTYPE {icerektipi}]
[COOKIE {cookie}] [REFERER {referer}]
[HEADERS {basliklar}] [REQUESTMETHOD {istekmetodu}];
Yanıt iki sistem değişkenine düşüyor:
SYS_HTTPPOSTRESPONSE: Sunucunun döndürdüğü gövde.SYS_HTTPPOSTCOOKIES: Yanıttan gelen cookie'ler.
Tipik bir kimlik doğrulamalı akış şöyle işliyor: önce boş bir POST göndererek başlangıç cookie'lerini alıyorsunuz, sonra bu cookie'leri kullanarak kullanıcı adı/şifre içeren asıl isteği atıyorsunuz.
Gerçek bir örnek: cookie tabanlı oturum açıp veri çekmek
/* Önce oturum cookie'sini alır, sonra kimlik bilgileriyle giriş yapar. */
LOCAL:
STRING COOKIEDEGERI;
STRING GIRISVERISI;
SENDHTTPPOST '' TO 'https://ornekservis.com/login';
COOKIEDEGERI = SYS_HTTPPOSTCOOKIES;
GIRISVERISI = 'username=btan&password=xxxx';
SENDHTTPPOST GIRISVERISI TO 'https://ornekservis.com/login'
CONTENTTYPE 'application/x-www-form-urlencoded'
COOKIE COOKIEDEGERI;
IF SYS_STATUS == 1 THEN
MESSAGE 'Servise bağlanılamadı.' TYPE ERROR;
RETURN;
ENDIF;
/* SYS_HTTPPOSTRESPONSE artık girişten sonraki sayfa/yanıtı içeriyor */
WSDL üzerinden çağırma: CALLWEBSERVICE
CALLWEBSERVICE {wsdlurl}, {operasyon} TO {sembol} WITH {parametreler};
Bu komut, WSDL tanımını okuyup belirtilen operasyonu doğrudan çağırıyor. Yanıt XML olarak döner ve genelde PARSEXML TEXT {sonuc} INTO {tablo} ile ayrıştırılır (XML ayrıştırmayı bir sonraki yazıda ayrıca ele alacağım).
/* Bir hava durumu servisinden şehir listesini çeker. */
LOCAL:
STRING XMLYANIT;
TABLE SEHIRLER(AD CHAR(100));
CALLWEBSERVICE 'https://ornekservis.com/sehirler?wsdl', 'GetCitiesByCountry'
TO XMLYANIT WITH 'Germany';
PARSEXML TEXT XMLYANIT INTO SEHIRLER;
SENDHTTPPOST ile CALLWEBSERVICE arasında nasıl seçim yapılır
- WSDL erişiminiz varsa ve servis SOAP tabanlıysa:
CALLWEBSERVICE— operasyon adı ve parametreleri doğrudan verirsiniz, XML zarfını (envelope) elle oluşturmanız gerekmez. - Servis REST/form-encoded ise, ya da WSDL'e erişiminiz yoksa:
SENDHTTPPOSTileCONTENTTYPE 'application/x-www-form-urlencoded'kullanarak isteği manuel kurarsınız. Belgeler bu ikinci yolu, WSDL ayrıştırmadan servis çağırmanın bir alternatifi olarak da öneriyor.
Sık yapılan hatalar
- CONTENTTYPE belirtmeden form verisi göndermek — hedef servis
application/x-www-form-urlencodedbeklerken bu başlığı atlamak, sunucunun gönderdiğiniz veriyi hiç anlamamasına yol açabilir. - Cookie'yi bir sonraki isteğe taşımayı unutmak — oturum gerektiren servislerde her
SENDHTTPPOSTçağrısı bağımsızdır; bir önceki yanıttan gelenSYS_HTTPPOSTCOOKIES'i açıkça bir sonraki çağrıyaCOOKIEparametresiyle vermezseniz oturum kaybolur. SYS_STATUS/yanıt kodunu kontrol etmedenSYS_HTTPPOSTRESPONSE'u işlemeye başlamak — hedef sunucu erişilemezse ya da hata döndürürse, yanıtı doğrudan ayrıştırmaya çalışmak anlaşılmaz hatalara yol açar.- WSDL'in değiştiğini fark etmemek — harici bir servis operasyon imzasını değiştirirse,
CALLWEBSERVICEçağrınız sessizce ya da anlaşılmaz bir hatayla başarısız olabilir; entegrasyon sorunlarında önce WSDL'in hâlâ aynı olup olmadığını kontrol edin.
Sıradaki adım
Kafka, RabbitMQ ve vektör veritabanları gibi modern entegrasyon uçlarına TROIA'nın Endpoint altyapısıyla nasıl bağlandığını bir sonraki yazıda ele alacağım.
Yorumlar (0)
Yorum Yaz