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.

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

www.sapuygulama.com

 

İlgili Makaleler

Bu yazıya 1 yorum yapılmış.

  • Yazılım Uzmanları - www.yazilimuzmanlari.com [SAP ABAP Mobile Application Server ] -

    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!

Yorum Gönder