Neden Web Service?

CANIAS ERP'nin masaüstü (Java) istemcisi dışında bir uygulama — web sitesi, mobil uygulama, üçüncü parti bir sistem — ERP'deki veriye veya iş mantığına erişmek istediğinde iki yol var: doğrudan veritabanına bağlanmak (kırılgan ve güvenliksiz) ya da CANIAS'ın kendi web servis altyapısını kullanmak. İKONPORTAL'ı geliştirirken tercih ettiğim yöntem ikincisiydi: ERP bağımsız çalışabilen bir sağlayıcı (provider) katmanı kurup, CANIAS entegrasyonunu bu web servis üzerinden gerçekleştirdim.

Akış: login → callService → logout

TROIA Web Service 2.0'ın arayüzü, hangi TROIA class method'unu çağırdığınızdan bağımsız olarak sabit dört metottan oluşur:

  1. login() — Client, Language, DBServer, DBName, ApplicationServer, Username ve şifrenin MD5 hash'ini alır; başarılıysa bir SessionId ve SecurityKey döner.
  2. callService() — asıl işi yapan metot. SessionId, SecurityKey, kayıtlı servisin ServiceId'si ve parametreler (XML formatında) gönderilir; TROIA class method'unun dönüş değerini içeren CaniasResponse gelir.
  3. listServices() — o oturumun çağırma izni olduğu servislerin listesini döner.
  4. logout() — session'ı application server'da kapatır.

Önemli bir nokta: callService() yalnızca önceden CANIAS tarafında web servis olarak kayıt edilmiş bir TROIA class method'unu çalıştırabilir. Rastgele bir class method'unu dışarıdan çağıramazsınız — bu, güvenlik açısından bilinçli bir sınırlama.

Parametre gönderimi: neden XML?

callService()'e gönderilen Parameters alanı XML formatlı bir string'dir:

<PARAMETERS>
    <PARAM>ilkParametre</PARAM>
    <PARAM TYPE="TABLE">
        <TABLO_ADI>
            <ROW>
                <KOLON1>deger1</KOLON1>
            </ROW>
        </TABLO_ADI>
    </PARAM>
</PARAMETERS>

Bu format ilk bakışta ağır görünse de pratik bir avantaj sağlıyor: basit tipler (string, integer, decimal) yanında TABLE ve VECTOR tipinde parametreler de doğrudan gönderilebiliyor. Yani TROIA tarafındaki class method'unuz bir TABLE parametresi bekliyorsa, web servis üzerinden de aynı şekilde çalışıyor — ayrı bir DTO/mapping katmanı yazmanıza gerek kalmıyor.

Şifreleme ve sıkıştırma

Varsayılan olarak bağlantı şifrelenmemiş gelir; login()'e Encrypted=true gönderirseniz sunucu size AES (CBC, PKCS7, 128-bit) ile bir EncryptionKey döner ve o oturumdaki tüm istek/yanıtlar bu anahtarla şifrelenir. Ayrıca 4000 karakterden uzun yanıtlar otomatik olarak sıkıştırılıp Base64 olarak dönebiliyor (Compress bayrağı bunu belirtiyor) — mobil bir istemci için veri kullanımını gözle görülür şekilde azaltıyor.

Pratikte ne anlama geliyor?

İK süreçlerini (izin, seyahat, masraf) ERP'nin dışına, Flutter tabanlı bir istemciye taşırken bu API üzerinden çalışmak şu iki şeyi garanti etti: veri hep ERP'de kaldı (portalda kişisel veri saklanmadı, KVKK açısından temiz), ve entegrasyon katmanı sağlayıcı (provider) deseniyle yazıldığı için yarın CANIAS dışında başka bir ERP'ye bağlanmak gerekirse sadece bu tek katman değişecek.