Rest API ve Qt Kombini

Rest API’ler popülerliğini halen korurken bunun altında yatan düşünceden azıcık bahsedeyim öncelikle. Özellikle veri tabanları gibi önemli bilgileri içeren sistemlere erişmenin bir çok yolu olabilir. Bu erişimin en güvenli ve en kolay yolu http kullanmaktır. Http, OSI modelinde uygulama katmanının en üst seviyesinde bulunduğundan güvenlik duvarları bu katmanda bir engel oluşturmaz ve ağlar arası transfer için oldukça kullanışlıdır. Ayrıca en üst katmanda olduğundan kendiliğinden bir güvenlik sağlar. Bu yüzden bu gibi sistemlere ulaşmak için sistemi diğer alt katmanlardan yalıtarak http gibi üst seviye bir protokol kullanmak daha mantıklıdır. Tabi TCP ve UDP nin de kendine göre avantajları vardır. Orası ayrı bir konu. Ayrıca bu sistemlere direk erişmektense erişimi yönetmek ve kontrol altında tutmak da ayrıca güzel bir fikirdir. İşte Rest API bu üç temel ana fikirden ortaya çıkıyor.

Eskiden maganda bir şekilde direk olarak veri tabanına erişirdik. Bu ise bize birincisi bir güvenlik problemi oluştururdu. İkincisi, çoğu makine üzerinden erişimde probleme yol açardı. Üçüncüsü ise her yazılım revizyonunda sisteme de mudahale etmemizi gerektirirdi. Fakat bunun yerine, veri tabanı ile yazılımımız arasında olan bir uygulama yazıp adına da Rest API dediğimiz günden beridir kafamız rahat artık. Zaten artık çoğu hosting ve sunucu ağ dışına veritabanı hizmeti sunmayı yasakladı ya da kapattı. Bu yüzden el mahkum çoğu durumda Rest Api yazmak durumunda kalıyoruz. Rest Apinin temel mantığı, Http isteklerini dinleyerek bu istekler doğrultusunda gerekli veri tabanı veya sistem fonksiyonalitesini isteği yapan makine veya yazılımlara sunması. Oldukça basit aslında.

Bu programı her dilde yazabilirsiniz. Fakat yazılan bu programın temel amacı bir fonksiyonalite sunmaktır. Buradaki fonksiyonaliteden kasıtı direk olarak yazılımdaki fonksiyon olarak düşünebilirsiniz. Her programlama dilinde fonksiyonlar giriş değerleri alır ve sonra yaptığı işlemin sonucunu döner. İşte burada da aynı fonksiyonaliteyi sunmak daha elverişli olacaktır. Bu yüzden Rest API ile olan haberleşmelerde genellikle Json gibi etiket dilleri kullanılır. Çünkü zaten Http üzerinde çalışıyoruz ve ayrıca etiket dilleri de komple Http destekli olduğu için dahiyane bir fikir oluyor.

O zaman hemen bir php Rest API örneği vereyim. Aşağıdaki kod, http üzerinden post, get gibi methodlar ile gelen Json textin’i parse ediyor. Json içerisinde fonksiyon ismi ve gerekli parametreleri var. Yani şöyle bir text;{FunctionName: “ExampleFunction”, params[param1, param2, … ]}. Gerekli fonksiyon ismi ve parametreleri doğrultusunda istenen fonksiyon çalıştırılıp sonucu string, int veya json olarak geri dönülüyor.

$json = file_get_contents('phpinput');
$data = json_decode($json);

$function_name = $data->{"FunctionName"};
$params = $data->{"params"};

$service = new MobicineService();
$service->accessService($function_name, $params); //result: ACANTHOSIS NIGRICANS

Bu örnek Rest API ye istekte bulunan yine örnek bir C++ yazılımı aşağıdaki kod gibi olabilir. Aşağıdaki kodda da anlaşıldığı üzere fonksiyon ismi ve fonksiyon parametreleri önce Json’a çevriliyor. Yukarıda verilen örnekteki gibi bir text çıktısı Http post ile ilgili sunucuya gönderiliyor. Ve yanıt, http üzerinden text olarak alınıyor.

    QStringList HttpAccess::makeHttpJsonRequest(const QString &FunctionName, 
                        const QStringList &Params)
{
    QStringList query_result;
    QNetworkReply *network_reply;
    QNetworkAccessManager network_access;
    QNetworkRequest network_request(QUrl(SERVICE_URL));
    network_request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");

    int time_out_counter = 0;

    network_reply = network_access.post(network_request, makeJsonObject(FunctionName, Params));

    while(!network_reply->isFinished())
    {
        if(time_out_counter++ >= NETWORK_TIMEOUT)
        {
            return QStringList("Connection Error");
        }

        qApp->processEvents();
    }

    QByteArray response = network_reply->readAll();

    query_result = QString(response).split("<br>", QString::SkipEmptyParts);
    query_result = query_result.toSet().toList();
    if(query_result.empty())
        query_result.append("No Result");

    return query_result;
}

Bu kodların devamını ve tüm uygulamayı, github hesabımdan bulabilirsiniz. https://github.com/electronicengine/mobicine

Yazılıma yeni başlayanlar için umarım faydalı bir yazı olmuştur. Kolay gelsin. 🙂

2 Yorum Mevcut

  1. Yazi icin tesekkurler, ancak birkac konuya dikkat cekmek isterim. REST aslinda bir doktora tezi ve isin teknik boyutundan ziyade kavramsal olarak tarif edilen bir RPC turu. Yani rest oncesinde de SOAP vs ile http uzerinden haberlesilen APİ ler vardi. Aslinda daha genel olarak uzun suredir, php/jsp/ajax sayfalarinda oldugu gibi herhangi bir application server’a hatta web server’a istek gonderebiliyoruz tipki browser’in yaptigi gibi.

Bir cevap yazın

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

Copyright © Tüm Hakları Saklıdır.