HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

KPS - MERNİS Sorgulama - Ruby, Savon ve SOAP

Geçtiğimiz hafta hem TTMesaj servisini hem de KPS'i (Kimlik Paylaşım Sistemi) Rails uygulamalarına entegre etme ihtiyacımızla birlikte, ismini pek sık duyduğum SOAP ile haşır neşir olmak durumunda kaldım. Üç-dört gün sonunda SOAP bana herhangi bir üçüncü dünya ülkesinin beyaz yakalı "plaza" çalışanını çağrıştırıyor. Bu çağrışımda ülkemizdeki SOAP servisleri ile haberleşen kod örneklerinin büyük çoğunlukla C#, ASP.Net ve Java ile yazılmış olmasının payı büyük.

Ruby tarafında ise Savon GEM'i olmasa halimiz yamanmış. Eğer sizde benim gibi SOAP hakkında zerre bilgi sahibi değilseniz ve bir şekilde bu servis ile haberleştirmek zorunda olduğunuz bir Ruby uygulamanız varsa ilk önce SOAP UI ile denemeler yapmanızı tavsiye ederim.

Bu uygulama içerisinde File -> New Project yolunu takip ederek, haberleşmeye çalıştığınız WSDL adresini yazın. Daha sonra WSDL'in sunduğu operasyonlara request aracı ile envai çeşit request yapmayı deneyerek dönen response'ları inceleyebilirsiniz.

İkinci bakmanız gereken yer ise Savon SOAP Client. Sırayla basitten zora, önce TTMesaj servisiyle haberleşmeyi - sonra ise KPS ile haberleşmeyi örnekleyeceğim.

TTMesaj SOAP Client

İlk önce WSDL üzerindeki mümkün tüm operasyonları listeyelim:

Request =>

require 'savon'

client = Savon.client(
  wsdl: "http://ws.ttmesaj.com/service1.asmx?WSDL",
  soap_version: 2
)

client.operations.each {|operation| p operation }

Response =>

:report_sms_summary
:get_sms_detail_from_id_list
:report_sms_summary_list
:get_sms_detail_from_id
:get_sms_originator_list
:get_sms_credit
:send_single_sms
:send_single_smsxml
:send_single_sms_end_date
:send_nto_nsms
:dll_alici_ekle
:get_user_info
:get_sub_user_list

İlgili WSDL sayfasını ziyaret ederek bu operasyonlardan herhangi birini inceleyerek nasıl bir request yapmamız gerektiğini inceleyelim. Örneğin send_single_sms operasyonuna bakalım:

<s:element name="sendSingleSMS">
  <s:complexType><s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="username" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="numbers" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="origin" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="sd" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="ed" type="s:string"/>
    </s:sequence></s:complexType>
</s:element>

Parametre isimlerini dikkate alarak SOAP mesajımızı hazırlayalım:

require 'savon'

client = Savon.client(
  wsdl: "http://ws.ttmesaj.com/service1.asmx?WSDL",
  soap_version: 2
)

message = {
  "username" => "secret",
  "password" => "secret",
  "numbers" => "90xxxxxxx",
  "message" => "Testing Purposes!",
  "origin" => "Sender Name",
}

response = client.call(:send_single_sms, message: message)

Bu çağrı sonucunda mesajınızın başarıyla iletildiğine dair "OK*" işaretli bir response alacaksınız. Uygulamanın tümüne şuradan erişebilirsiniz: https://github.com/msdundar/TTMesaj

KPS (Kimlik Paylaşım Sistemi)

KPS tarafında işler beni umduğumdan daha çok zorladı. 3-4 gün boyunca başarılı bir response almak için uğraştım. KPS servisi TTMesaj'dan farklı olarak, requestiniz içerisinde bir takım attribute'ler ve tamamen doğru kurgulanmış bir SOAP Header görmeyi bekliyor.

Öncelikle biraz önce yaptığımız gibi bir keşif turuna çıkalım. İlgili WSDL adresini ziyaret ettiğimizde beklenen request yapısını görebiliyoruz:

POST /KPSService/servicetckimliksorgula.asmx HTTP/1.1
Host: 192.168.33.25
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <KPSUserInfo xmlns="http://tempuriTCKimlik.org/">
      <UserName>string</UserName>
      <Password>string</Password>
    </KPSUserInfo>
  </soap12:Header>
  <soap12:Body>
    <TCKimlikNoSorgu xmlns="http://tempuriTCKimlik.org/">
      <TCKimlikNo>string</TCKimlikNo>
    </TCKimlikNoSorgu>
  </soap12:Body>
</soap12:Envelope>

Burada farklı bir çok uygulama var. Öncelikle authentication header altında direk değil, header altında bulunan KPSUserInfo içerisinde UserName ve Password ile gerçekleşiyor.

Diğer farklı durum ise, KPSUserInfo ile birlikte xmlns adresininde attibute olarak verilmesi bekleniyor. Aynı durum body'de yine karşımıza çıkıyor. Orada ise TCKimlikNoSorgu altında mesajın verilmesi ve xmlns attribute'ü bekleniyor. Uzun araştırmalar sonucunda Savon ile bu işin nasıl yapılabileceğini buldum. Sonuçta ortaya şöyle bir uygulama çıktı:

client = Savon.client(
  wsdl: "http://192.168.33.25/KPSService/servicetckimliksorgula.asmx?WSDL",
  namespace: "http://tempuriTCKimlik.org/",
  soap_version: 2,
  soap_header: {
    "KPSUserInfo" =>
      {
        "UserName" => "******",
        "Password" => "******"
      },
      :attributes! => {
      "KPSUserInfo" =>
        {
          :xmlns => 'http://tempuriTCKimlik.org/'
        }
      }
  }
)

message = {
  "TCKimlikNo" => "**********"
}

response = client.call(:tc_kimlik_no_sorgu, message: message)
end

Burada beni en çok zora sokan :attributes! hakkında Savon'un hiç dökümantasyon yapmamış olması, username yerine UserName gibi camel case takıntılı SOAP servisi, ve header ile body altında kullanılan alt parametreler oldu.

Uygulamanın tümüne şuradan erişebilirsiniz: https://github.com/msdundar/kps_soap_client

Başarılar.


Share this post!


Blog Comments powered by Disqus.