Bu yazımızda mobil uygulamamız direkt SAP de bulunan Internet Communication Framework (ICF) de oluşturacağımız servis ile haberleşecek işlemleri gerçekleştireceğiz.
- Yazılım Uzmanları
- 09 Haziran 2020
- 690 kez görüntülendi.
Bir mobil uygulaması oluşturmak istediğimizde genel olarak kullandığımız yapı ;
- Sunucu Uygulaması :Internet Information Server da çalışan uygulamamız mobil uygulamasından gelen talepleri değerlendirip veritabanından talebe uygun verileri geri mobil uygulamasına gönderen uygulama
- Database Server : Tüm verilerin tutulduğu veritabanımız.
- Mobil Uygulama : Kullanıcı arayüzlerinde yaptığı işlemleri Application Server a gönderip geri dönen değerlere göre işlem yaptığımız Android, IOS vb. uygulaması .
Mobil uygulaması IIS Server a istekte bulunur. IIS Server da gelen isteğe göre veritabanına bağlantı kurup isteğe uygun işlem yapar ve mobil uygulamasına geri cevap döner. Bir mobil uygulamasının yapısına göre Azure, Google, Facebook sunucularına bağlanan farklı yapılar da olabilir. Ancak basit bir mobil uygulamasının en temel yapısını bu şekilde özetleyebiliriz.
Bu yazımızda ise mobil uygulamamız direkt olarak SAP de bulunan Internet Communication Framework (ICF) de oluşturacağımız servis ile haberleşerek işlemleri gerçekleştireceğiz. (Bu işlem için SAP Web Dispatcher da gerekli ayarların yapılmış olması gerekiyor. )
Bu yapının nasıl işlediğini gösterebilmek için küçük bir senaryo oluşturalım. Bu senaryomuzda mobil uygulamamız cihaz bilgilerini Sap de oluşturduğumuz servise gönderecek ve geri gelen değere göre kullanıcı girişi gerçekleştirecek. Bunun için ;
- Data Table (ZMOB_DEVICE) : Mobil uygulamayla ilgili bilgileri tutacak. Bu bilgiler içerisinde DeviceId, Brand, Display, Model, Pernr ve IsActive bilgilerini tutacak. Yani login olmaya çalışan cihazın device id si ile personel bilgisini alacağız. Bu bilgilerin oluşturacağımız tablonun içerisinde olup olmadığını kontrol edeceğiz. Bu bilgiler yok ise mobil uygulamaya hata mesajı göndereceğiz. Mobil uygulama bu hata mesajını gördüğünde tüm cihaz bilgilerini geri sap ye gönderecek. SAP servisimiz bu bilgileri tablomuza kaydedecek ve SAP tarafında bu cihaza yetki verildikten sonra cihaz login işlemini gerçekleştirebilecek.
- Structure : (ZMOB_S_DEVICE) : Bu structure ımız mobil ile icf de kuracağımız servisimiz arasında bilgilerin aktarılmasını sağlayacak.
- Class (ZCL_MOB_DEVICE) :Bu classımız ZMOB_DEVICE tablosuyla ilgili işlemleri gerçekleştirecek. CRUD diye tanımladığımız (Create, Read, Update, Delete) işlemleri bu classımız üstelenecek. Mobil uygulamamız login, register ve/veya checklogin fonksiyonlarımızdan oluşacak. Aynı zamanda bu classımızda ICF yazımızda belirttiğimiz IF_HTTP_EXTENSION interface ini kullanarak webden gelen çağrıları dinleyerek geri değerler döneceğiz.
- JSON Serializer(zcl_trex_json_serializer) :Geri dönmek istediğimiz structure/tabletype ları JSON formatına dönüştürerek geri göndereceğiz. Standartta cl_trex_json_serializer class ı bulunuyor. Ancak bu classı özelleştirip bazı düzeltmeler yapacağız.
- MobileApp: SICF içerisinde servis oluşturarak yazdığımız ZCL_MOB_DEVICE classını bu servise bağlayacağız.
İlk olarak ZMOB_S_DEVICE structure ımızı oluşturalım. Bunun için se11 den structure ımızı oluşturalım.
Son olarak Data Table ımızı oluşturacağız. Tüm login olan mobil uygulamaların bilgilerini bu tabloda tutacağız. Bu tablomuzu da se11 den Data Table kısmından oluşturacağız.
Kullanıcı ve mobil bilgileri tutacağımız tablomuzu da oluşturduk. Şimdi ise sıra class ımıza geldi. Bu classımızı da se24 ten oluşturalım. Ardından Interface kısmına IF_HTTP_EXTENSION ı ekleyelim.
Interface imizi ekledikten sonra Methods kısmında aşağıdaki metodları oluşturalım.;
- GetUserAbout : Bu classımızın parametreleri :
- I_PERNR (Importing): PERSNO tipinde kullanıcı personel numarası.
- I_SECID (Importing): CHAR40 tipinde kullanıcının login olmaya çalıştığı mobil cihazın id si
- E_RESULT (Returning):
- SetUserAbout : Bu classımızın parametreleri:
- I_DEVICE (Importing): ZMOB_S_DEVICE tipinde ve mobil cihazın bilgilerini bulunuyor.
GetUserAbout:
method GETUSERABOUT.
* Data: ls_zmob_device type ZMOB_S_DEVICE.
select single
dev~secid
dev~pernr
pa1~ename
dev~brand
dev~devce
dev~model
dev~displ
dev~ggreg
dev~isact
from zmob_t_device as dev
join pa0001 as pa1 on pa1~pernr eq dev~pernr
join pa0000 as pa0 on pa0~pernr eq pa1~pernr
and pa0~subty eq pa1~subty
and pa0~objps eq pa1~objps
and pa0~sprps eq pa1~sprps
and pa0~endda eq pa1~endda
and pa0~begda eq pa1~begda
into e_result
where dev~secid = i_secid
and dev~pernr = i_pernr
and pa0~massn ne 10
and pa1~endda ge sy-datum
and pa1~begda le sy-datum.
endmethod.
SetUserAbout:
method SETUSERABOUT.
Data: ls_device type zmob_s_device,
ls_t_device type zmob_t_device.
ls_device = zcl_mob_device=>getuserabout( i_pernr = i_device-pernr
i_secid = i_device-secid ).
if ls_device is initial.
"kayıt tarihi eklenmeli.
ls_t_device-secid = i_device-secid.
ls_t_device-pernr = i_device-pernr.
ls_t_device-brand = i_device-brand.
ls_t_device-model = i_device-model.
ls_t_device-devce = i_device-devce.
ls_t_device-displ = i_device-displ.
insert into zmob_t_device values ls_t_device.
endif.
endmethod.
Kullanıcı bilgileriyle ilgili metodlarımızı tamamladık. Şimdi ise web isteklerini handler edip bu metodlara yönlendireceğimiz IF_HTTP_EXTENSION~HANDLE_REQUEST metodunu düzenleyeceğiz
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
Data: cl_serializer TYPE REF TO zcl_trex_json_serializer,
lv_verb type string,
lv_path_info type string,
lv_pernr type persno,
lv_devid type char40,
lv_result type string,
ls_result type ZMOB_S_DEVICE_RESULT,
lv_resource type string.
lv_verb = server->request->get_header_field( name = '~request_method' ).
lv_path_info = server->request->get_header_field( name = '~path_info' ).
lv_pernr = server->request->get_header_field( 'Pernr' ).
lv_devid = server->request->get_header_field( 'DeviceId' ).
if ( lv_verb ne 'GET' ) and
( lv_verb ne 'POST' ) and
( lv_verb ne 'PUT' ) and
( lv_verb ne 'DELETE' ).
call method server->response->set_status( code = '405'
reason = 'Method not allowed' ).
call method server->response->set_header_field( name = 'Allow'
value = 'POST, GET, PUT, DELETE' ).
exit.
endif.
case lv_verb.
when 'GET'.
Data: ls_json_string type string.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_pernr
IMPORTING
output = lv_pernr.
ls_result-rdata = zcl_mob_device=>getuserabout( i_pernr = lv_pernr
i_secid = lv_devid ).
if ls_result-rdata is initial.
ls_result-rtype = 1.
ls_result-rmess = 'Kayıt bulunamadı.'.
ls_result-count = 1.
else.
ls_result-rtype = 0.
ls_result-rmess = 'Başarıyla alındı.'.
ls_result-count = 1.
endif.
create object cl_serializer
exporting
DATA = ls_result.
cl_serializer->serialize( ).
* ls_json_string = cl_serializer->get_data( ).
CALL METHOD server->response->set_cdata( data = cl_serializer->get_data( ) ).
* CALL METHOD server->response->set_cdata( data = ls_json_string ).
when 'POST'.
Data: ls_device type zmob_s_device.
ls_device-secid = server->request->get_header_field( 'secid' ).
ls_device-pernr = server->request->get_header_field( 'pernr' ).
ls_device-model = server->request->get_header_field( 'model' ).
ls_device-displ = server->request->get_header_field( 'displ' ).
ls_device-devce = server->request->get_header_field( 'devce' ).
ls_device-brand = server->request->get_header_field( 'brand' ).
if ls_device-secid is initial or
ls_device-pernr is initial or
ls_device-model is initial or
ls_device-displ is initial or
ls_device-brand is initial.
ls_result-rtype = 1.
ls_result-rmess = 'Bilgiler boş geliyor.'.
ls_result-count = 0.
else.
zcl_mob_device=>setuserabout( i_device = ls_device ).
ls_result-rdata = zcl_mob_device=>getuserabout( i_pernr = lv_pernr
i_secid = lv_devid ).
if ls_result-rdata is initial.
ls_result-rtype = 1.
ls_result-rmess = 'Kayıt bulunamadı.'.
ls_result-count = 1.
else.
ls_result-rtype = 0.
ls_result-rmess = 'Başarıyla alındı.'.
ls_result-count = 1.
endif.
* ls_result-rtype = 0.
* ls_result-rmess = 'Başarılı'.
endif.
create object cl_serializer
exporting
DATA = ls_result.
cl_serializer->serialize( ).
CALL METHOD server->response->set_cdata( data = cl_serializer->get_data( ) ).
when 'PUT'.
CALL METHOD server->response->set_cdata( data = 'Put Method!' ).
when 'DELETE'.
CALL METHOD server->response->set_cdata( data = 'Delete Method!' ).
endcase.
endmethod.
Bu methodumuzda gelen request metodunu (Get,Post,Delete, Put) header dan alıyoruz. İstek tipi Get, Post, Put, Delete metodunda değil ise geriye "405-Method not allowed" hatası ve hangi metodları kabul ettiğini belirten bir mesaj gönderiyoruz.
Talep Get metoduysa gelen querystring leri header dan alıyoruz. Ardından ZCL_MOB_DEVICE classımızdaki GetUserAbout metoduna gönderiyoruz.
Bu metoddan geri dönen değerleri cl_serializer zcl_trex_json_serializer tipindeki cl_serializer ile dışarı json formatında dönüyoruz.
Talep POST metoduysa içeriğindeki diğer post edilen verileri headerden alarak ZCL_MOB_DEVICE classımızdaki SetUserAbout metoduna gönderiyoruz. Burada oluşturduğumuz ZMOB_T_DEVICE tablosuna kaydetmesini sağlıyoruz.
Put ve Delete metodlarını boş geçtik.
Buna uygun metodları dilersek yazabiliriz.
Örnek Uygulamalar :
- https://www.bulutuygulamalari.com/Applications/2/Sap-Uygulamalari
Bu yazıya 1 yorum yapılmış.
I do not even know how I ended up here, but I thought this post was good. I do not know who you are but certainly you're going to a famous blogger if you are not already ;) Cheers!