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.

/* Ö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: SENDHTTPPOST ile CONTENTTYPE '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-urlencoded beklerken 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 gelen SYS_HTTPPOSTCOOKIES'i açıkça bir sonraki çağrıya COOKIE parametresiyle vermezseniz oturum kaybolur.
  • SYS_STATUS/yanıt kodunu kontrol etmeden SYS_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.