sap abap fonksiyonu ile web servis yaratma ve soap ile bu web servise ulaşma (creating web service in abap with rfc)

sap haricinde herhangi bir dış kaynaktan sap verisi çekmek istiyorsak web servise ihtiyaç duyarız. sap’de web servis üretmek için iki yol vardır. bunlardan birincisi ve sap’nin bizden beklediği SOAMANAGER işlem kodu yardımıyla web servis üretmektir. fakat ben daha pratik olan diğer yöntemi anlatacağım. öncelikle SE37 işlem kodu ile ZSD_F_GET_MATNR diye bir remote enabled fonksiyon yaratıyoruz. daha sonra import parametresi olarak malzeme numarası alıp export parametresi olarak mara yapısını kullanıcıya gönderiyoruz.

FUNCTION zsd_f_get_matnr.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IP_MATNR) TYPE  MATNR
*"  EXPORTING
*"     VALUE(ES_MARA) TYPE  MARA
*"----------------------------------------------------------------------
 
  SELECT SINGLE * FROM mara INTO es_mara
    WHERE matnr EQ ip_matnr.
 
ENDFUNCTION.

daha sonra SICF işlem kodu ile ‘default host/sap/bc/soap’ altındaki bütün servisleri aktif hale getirmemiz gerekiyor. Bu servisleri aktif hale getirdikten sonra sistemdeki remote enabled fonksiyonların web servis definition (wsdl) dosyalarına aşağıdaki şablon ile erişebiliriz.

http://<domain>:<port>/sap/bc/soap/wsdl/?services=<function name>&sap-client=<client>

domain:sap sisteminde tanımlı sunucu adresi
port:sunucunun http portu
function name:fonksiyonun adı
client:sap sisteminin client numarası

Örnek: http://dev.serkanozcan.com:80/sap/bc/soap/wsdl/?services=ZSD_F_GET_MATNR&sap-client=111

Bu wsdl’e eriştiğinizde endpoint olarak erişeceğiniz url şu şekilde olacaktır; http://dev.serkanozcan.com:80/sap/bc/soap/rfc/

Son olarak aşağıdaki xml soap mesajını elde ettiğimiz endpoint’e gönderirsek XXXX malzemesinin detaylarını response olarak alabiliriz.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:sap-com:document:sap:rfc:functions">
<soapenv:Header/>
<soapenv:Body>
<urn:ZSD_F_GET_MATNR>
<IP_MATNR>XXXX</IP_MATNR>
</urn:ZSD_F_GET_MATNR>
</soapenv:Body>
</soapenv:Envelope>