Python Flask ile Basit Rest-API Oluşturma ve ABAP ile API Etkileşimi

Merhaba değerli okuyucular! Bugün sizlerle hem Python hem de ABAP dillerinde yazılmış iki farklı servis kodu üzerinde duracağız. Öncelikle Python’da yazılmış olan bir Flask REST API servisini inceleyeceğiz. Daha sonra bu servise ABAP dili ile nasıl ulaşılabileceğini ve istenen verinin alınabileceğini göreceğiz. Python dilini kullanarak Flask kütüphanesini kullanarak basit bir hesap makinesi API’si oluşturmayı ele alacağız. API, dört temel matematiksel işlem olan toplama, çıkarma, çarpma ve bölme işlemlerini gerçekleştirebilecek ve sonuçları JSON formatında döndürecektir.

Bir SAP sistemi genellikle çok büyük veri setlerini yönetmek ve işlemek için kullanılır. Bu tür bir sistem, verilerin yönetilmesi ve analiz edilmesi için çok sayıda araca ve yeteneğe sahiptir. Ancak, bazen bu verilerin dış bir sistemde (örneğin, bir Python uygulamasında) işlenmesi gerekebilir.

Bu durumlarda, bir RESTful API servisi kullanmak oldukça kullanışlı olabilir. Python’da, Flask gibi bir web framework’u kullanarak hızlı ve etkili bir şekilde RESTful API’ler oluşturabiliriz. Bu API’ler, belirli bir URL’ye yapılan HTTP taleplerine yanıt vererek dış dünyayla etkileşim kurabilirler.

Bir ABAP programı bu API ile etkileşime girebilir ve verileri alabilir veya gönderebilir. Bu, ABAP’ın HTTP istemci yeteneklerini kullanarak gerçekleştirilir. ABAP programı, belirli bir URL’ye HTTP isteği gönderir ve yanıtı alır. Bu yanıt genellikle JSON formatında bir veri setidir.

Bu teknik, Python ve ABAP’ı birleştirmenin ve her ikisinin de güçlü yönlerini kullanmanın güzel bir örneğidir. Python’un esnekliği ve geniş çaplı kütüphane desteği, çok çeşitli veri işleme ve analiz işlemlerini kolaylaştırır. Diğer yandan, ABAP, SAP sistemlerindeki büyük veri setleriyle etkileşime geçmek ve bu verileri işlemek için güçlü araçlar sağlar.

Python ve ABAP’ı birleştirmek, hem veri işleme hem de sistemler arası etkileşim için oldukça güçlü ve esnek bir çözüm olabilir. Bu teknik, veri bilimciler ve ABAP geliştiriciler için bir dizi yeni olanak açabilir. Umarım bu yazı, bu konunun daha geniş anlamlarını ve pratik uygulamalarını anlamanızı sağlar. Her iki dilin de sunduğu olanaklardan en iyi şekilde yararlanabilmek için daha fazla bilgi edinmek ve daha fazla pratiğe ihtiyaç olduğunu unutmayın!

Öncelikle, Python’da kullanılan Flask isimli bir mikro web framework’ü ile oluşturulmuş RESTful API servisine bir göz atalım.

Adım 1: Flask Kurulumu

Öncelikle, Python’ı ve Flask kütüphanesini sisteminize kurmalısınız. Eğer Python yüklü değilse python.org adresinden indirebilirsiniz. Daha sonra terminalinizde aşağıdaki komutu çalıştırarak Flask’ı kurabilirsiniz:

pip install flask flask-restful

Adım 2: Flask API Kodu

Şimdi, basit bir hesap makinesi API’si oluşturmak için Flask ile kod yazalım.

from flask import Flask, request, jsonify
from flask_restful import Api, Resource, reqparse

app = Flask("LitsRest")
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('num1', type=int, required=True)
parser.add_argument('num2', type=int, required=True)
parser.add_argument('result', required=False)
parser.add_argument('message', required=False)

class Math(Resource):
    def get(self):
        return 'Hoş geldiniz! Matematiksel işlem API\'sine hoş geldiniz.'

    def post(self, operator):
        if operator in ['+', '-', '*', '/']:
            request.get_json(force=True)
            args = parser.parse_args()
            num1 = args['num1']
            num2 = args['num2']
            result = str(self.execute(num1, num2, operator))
            return jsonify(num1=num1, num2=num2, result=result, message='success')

    def execute(self, num1, num2, op):
        if op == '+':
            return num1 + num2
        elif op == '-':
            return num1 - num2
        elif op == '*':
            return num1 * num2
        else:
            return num1 / num2

class Selamla(Resource):
    def get(self):
        return 'Merhaba Dünya!'

api.add_resource(Math, '/operators/<operator>')
api.add_resource(Selamla, '/')

if __name__ == '__main__':
    app.run()

Bu kod, Flask web çerçevesi ve Flask-RESTful eklentisi kullanılarak basit bir RESTful API servisi oluşturur. Servis, bir aritmetik işlemi gerçekleştirip sonucunu dönen “Math” adlı bir kaynağı ve selamlaşma mesajı dönen “Selamla” adlı bir kaynağı içerir.

API servisi üzerindeki “Math” kaynağı, num1 ve num2 argümanlarını alır ve belirtilen aritmetik operatörüne (toplama, çıkarma, çarpma veya bölme) göre bir sonuç döndürür. Örneğin, kullanıcı /operators/- endpoint’ine POST talebi gönderdiğinde ve talep gövdesinde {“num1”: 10, “num2”: 5} json verisini belirttiğinde, servis num1’den num2’yi çıkarır ve sonucu döndürür.

Adım 3: API’nin PythonAnywhere’de Yayınlanması

PythonAnywhere, ücretsiz ve ücretli seçenekleri bulunan bir bulut tabanlı Python barındırma platformudur. Bu platformda Python Flask API’sini yayınlamak oldukça kolaydır.

Ücretsiz plan ile yayımlanmış API’miz için username.pythonanywhere.com domaini altında projemiz publish edilmiş olacak. Publis edebilmek için izleyeceğiniz adımların detaylarına girmeyip https://help.pythonanywhere.com/pages/Flask/ bu bağlantı üzerinden takip etmeniz gereken adımları bulabilirsiniz.

Not: PythonAnywhere, ücretsiz hesaplar için saatlik bir etkinlik sınırına sahip olabilir, bu nedenle sık sık istekler gönderirseniz sınıra ulaşabilirsiniz. Projenizin ihtiyaçlarına göre, ücretsiz hesap yerine ücretli bir hesap düşünebilirsiniz.

Adım 4: API Kullanımı

API’mizi başarılı bir şekilde oluşturduk. Şimdi, bu API’yi ABAP dilini kullanarak çağıralım ve sonuçları alalım.

*&---------------------------------------------------------------------*
*& Report ZABAP_TO_PYTHON_2
*&---------------------------------------------------------------------*
*&gönderilen json: '{ "num1": 100, "num2": 10 }'
*&gelen json: '{ "num1": 100, "num2": 10, "message": "s","resoult" : "90" }'
*&servis url: http://hamzaefe44.pythonanywhere.com/operators/- [+,-,*,/] alabilir.
*&---------------------------------------------------------------------*
REPORT zabap_to_python_2.
"client'lar
DATA: lo_http_client TYPE REF TO if_http_client,
      lo_rest_client TYPE REF TO cl_rest_http_client.
"request objesi ve içerik için data tanımlamaları
DATA: lo_request TYPE REF TO if_rest_entity,
      lv_body    TYPE string.
"response objesi, dönen json değer ve başlık ile ilgili bir takım bilgiler
DATA: lo_response       TYPE REF TO if_rest_entity,
      lv_http_status    TYPE string,
      lv_reason         TYPE string,
      lv_response       TYPE string,
      lv_content_length TYPE string,
      lv_location       TYPE string,
      lv_content_type   TYPE string.
"gelen json'u parsedebilmek için field-symbol tanımlamaları
FIELD-SYMBOLS: <field>       TYPE any,
               <field_value> TYPE data.
"servisten dönen response'de almak istediğimiz değerler
DATA: lv_message TYPE string,
      lv_num1    TYPE i,
      lv_num2    TYPE i,
      lv_resoult TYPE string.
"http client objesi oluşturma
cl_http_client=>create_by_url(
  EXPORTING
    url                = 'http://hamzaefe44.pythonanywhere.com/operators/-'
*    proxy_host         =
*    proxy_service      =
*    ssl_id             =
*    sap_username       =
*    sap_client         =
  IMPORTING
    client             = lo_http_client
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3
    OTHERS             = 4
).
IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
"http client'i ile rest client oluşturma
lo_rest_client = NEW #( io_http_client = lo_http_client ).
"request objesi ile requestimizin detaylarının ayarlanması
lo_request = lo_rest_client->if_rest_client~create_request_entity( ).
lo_request->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json )."media type
lv_body = '{ "num1": 100, "num2": 10 }'."gönderilecek json data
lo_request->set_string_data( iv_data = lv_body )."json datayı requeste verme
"post isteği
lo_rest_client->if_rest_resource~post( lo_request ).
"response ve header bilgilerini alma
lo_response = lo_rest_client->if_rest_client~get_response_entity( ).
lv_http_status = lo_response->get_header_field( '~status_code' ).
lv_reason = lo_response->get_header_field( '~status_reason' ).
lv_content_length = lo_response->get_header_field( 'content-lenght' ).
lv_location = lo_response->get_header_field( 'location' ).
lv_content_type = lo_response->get_header_field( 'content-type' ).
lv_response = lo_response->get_string_data( ).

WRITE: / 'http status:', lv_http_status, lv_reason.
WRITE: / 'response:', lv_response.

"gelen json'u pars etme adımları
DATA(lr_data) = /ui2/cl_json=>generate( json = lv_response ).
*/ui2/cl_json=>deserialize(
*  EXPORTING
*    json             =  lv_response
**    jsonx            =
**    pretty_name      =
**    assoc_arrays     =
**    assoc_arrays_opt =
*  CHANGING
*    data             = lv_data
*).



ASSIGN lr_data->* TO FIELD-SYMBOL(<data>).
ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field> .
lr_data = <field>.
ASSIGN lr_data->* TO <field_value>.
lv_message = <field_value>.
ASSIGN COMPONENT 'NUM1' OF STRUCTURE <data> TO <field> .
lr_data = <field>.
ASSIGN lr_data->* TO <field_value>.
lv_num1 = <field_value>.
ASSIGN COMPONENT 'NUM2' OF STRUCTURE <data> TO <field> .
lr_data = <field>.
ASSIGN lr_data->* TO <field_value>.
lv_num2 = <field_value>.
ASSIGN COMPONENT 'RESOULT' OF STRUCTURE <data> TO <field> .
lr_data = <field>.
ASSIGN lr_data->* TO <field_value>.
lv_resoult = <field_value>.

WRITE: / |-------json values---------|.
WRITE: / |message :{ lv_message }|,/ |{ lv_num1 } islem { lv_num2 } = { lv_resoult }|.

Bu kod öncelikle HTTP istemcisini oluşturur ve istemciyi belirtilen URL’ye bağlar. Ardından, istemci üzerinden bir REST istemcisi oluşturulur. Bu istemci, API’ye gönderilecek POST talebini oluşturur. Talep, JSON formatında bir gövde alır (bu durumda, num1 ve num2 değerlerini içerir).

Kod daha sonra API’ye POST talebini gönderir ve yanıtı alır. Yanıt, HTTP durum kodunu ve API’den dönen JSON yanıtını içerir. JSON yanıt, /ui2/cl_json sınıfının generate ve deserialize metodları kullanılarak işlenir ve sonuç çıktıya yazdırılır.

Bu şekilde Python ve ABAP kullanarak bir web servisine istek atma ve gelen yanıtı işleme konularını incelemiş olduk. Her iki dilin de web servislerle etkileşim için kullanışlı özelliklere sahip olduğunu görebiliriz. Python’un Flask gibi kolay kullanılabilir ve güçlü çerçeveler ile hızlı ve etkin web servisleri oluşturabildiğini, ABAP’ın ise SAP sistemlerindeki verilerle etkileşime geçmek için kuvvetli bir araç olduğunu söyleyebiliriz. Umarım bu yazı sizin için faydalı olmuştur, bir sonraki yazıda görüşmek üzere!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir