obenplus.com | oben+ | Hikayesi bol bir yazılımcının kaleminden, teknoloji dünyasını en önemli ve en ince ayrıntısına kadar takip etmek, bir yazılımcının hayatını, yaşantısını gözlemlemek isteneyenler için...

All posts tagged API

Günümüzde orta ölçekli firmalarda ve bir çok kurumsal web uygulamasında kullanılıyor Spring. Her firmanın kendine göre bir mimarisi oluyor. Çoğunluk halen SOAP üzerinden iletişimde kalmayı tercih etse de -haklı sebepleri de var- artık trend REST üzerine kaymakta. (Rest ile ilgili yazılarımdan birine buradan, diğerine buradan ulaşabilirsiniz.)

Spring Boot ise popülerleşme yolunda büyük yol katetti bile. Peki nedir bu Spring Boot ? Spring Boot tek amaçlı frameworklerle ya da basmakalıp kodları ve ayar işlerini neredeyse ortadan kaldıran devingen dillerle ilişkilendirebileceğiniz bir kod yazma yaklaşımıdır. Bakınız bunu ben demiyorum, bunu Pivotal’ın danışman ürün pazarlama müdürü Pieter Humphrey diyor 🙂

Ben de bugün kolları sıvadım, güzel bir blog yazısı yazmaya karar verdim bu konuyla ilgili.  Şöyle bir senaryomuz var : Bir api katmanımız olacak ve bu katmana kullanıcılarımız login olarak api üzerindeki metodları token bazlı koşabilecekler. Burada karıştırmamamız gereken bir nokta, bu yazımda, Oauth ya da Oauth2 üzerine bir access_token mantığından bahsetmiyoruz. Çünkü bizim senaryomuzda, 3rd party bir client üzerinden erişim olmayacak. Biz API mizi yazacağız ve kurumumuzun Web uygulaması da Mobil uygulaması da aynı api üzerinden çalışacak.

Konumuzun temelini authorization süreçleri oluşturduğundan, aşağıdaki lifecycle ı dikkatle incelemenizi rica ediyorum. Aslında yapmak istediğimiz şey tam olarak da bu.

authBizim örneğimizde, /api/v1/user pathine erişmek isteyeceğiz. Bu path, sadece ROLE_ADMIN yetkisine sahip kişilerin görebileceği bir path. Uygulamamızın token bazlı süreci işletirken buna uygun çalışması son derece kritik.

Akış ise şu şekilde olacak;

  • Kullanıcı /api/v1/user pathine erişmeye çalışır
  • AuthenticationServer kullanıcının 401.UNAUTHORIZED olduğunu döner. Çünkü bu pathe ulaşabilmek için bir token gerekmektedir.
  • Bu sefer token almak için /api/v1/login pathine headerda username ve password değişkenlerimiz gönderilir.
  • AuthenticationServer 200.OK döner ve headerda token değerini bildirir.
  • Artık bu token değeri belirli bir rol için yetkiye sahip ve tekrar /api/v1/user ı çağırabiliriz

 

Böyle bir yapı kurabilmek için öncelikle yapmamız gereken SpringBoot uygulamamızı Maven in de yardımıyla kurmak.

Read more


Blogumdaki yazılar, hiç bir maddi amaç güdülmeden, tamamen Türk yazılımcılarına, Türkçe kaynak olabilmesi için hazırlanmış yazılardır. Bu nedenle, yazıya verilen emeğin bir sonucu olarak, yazıyı benimle iletişime geçip iznimi almadan paylaşmamanızı rica ederim. Yazılarımın paylaşılması durumunda doğacak olan yasal haklarımı kullanabileceğimi belirtmek isterim.

Yazı içerisindeki kodlar ve örnekler, kısıtlı zaman içerisinde hazırlandığı için, bir takım hatalar içerebilmektedir. Bu konuda beni mail ya da telefon yolu ile bilgilendirebilirseniz, sevinirim.

Bu yazı içerisinde REST API kullanımı çok fazla bulunmaktadır. Bu nedenle yazıya başlamadan önce REST API konseptini bildiğinizden emin olunuz. Emin değilseniz lütfen buradaki ve buradaki yazılarımı okuyarak konuya hazırlanınız.

Elasticsearch’ü bilgisayarınıza nasıl kuracağınıza ve Elasticsearch Marvel, Sense hakkında detaylı bilgiye bu yazımdan ulaşabilirsiniz.

Amaç

ElasticSearch (Aslında ElasticSearch eski adı, artık Elastic olarak anılıyor fakat bende alışkanlık oldu, ElasticSearch olarak yazacağım), büyük ölçekli, açık kaynak kodlu bir arama motorudur. Apache Lucene üzerine kurulmuş bir yapısı vardır ve kulağa en hoş gelen özelliği sunduğu REST API sayesinde, kolaylıkla kullanılabilir olmasıdır. Bu tutorialde sizlere Elasticsearch’ün anahtar konseptlerinden bahsetmeye çalışacağım.

Sense ile Elasticsearch REST API Kullanımı

Elastic’i indirip, bir instanceına sahip olduğunuz andan itibaren, artık sizinle REST API üzerinden JSON bazlı olarak localhost’un 9200 portundan konuşan bir Elasticsearch cluster’ına sahip olmuş oluyorsunuz. Bu durumun doğal sonucu olarak, herhangi bir HTTP Client’ı kullanarak, Elastic ile konuşabilir hale geliyorsunuz. Elasticsearch’ün kendi dökümantasyonunda genelde Sense ya da CURL komutları ile örneklemeler yapılmıştır. Herneyse, eğer siz Sense ya da CURL kullanmaya istekli değilseniz, herhangi bir grafiksel HTTP client uygulamasını bilgisayarınıza indirerek kurabilirsiniz.

Daha proaktif olsun farklı bir çözüm ama kullanışlı bir çözüm arıyorum diyorsanız, size Google Chrome’un bir extensionu olan Sense pluginini önerebilirim. Plugini buradan ekleyebilirsiniz. Sense plugin sayesinde Elastic’in REST API’sine basit ve prettify edilmiş bir UI üzerinden ulaşmanız mümkün. Burada ayrıca pluginin bir özelliği olarak Autocomplete ile Elastic’in query syntaxına kolaylıkça adapte olabilirsiniz. Bir request’i run etmeniz için CTRL+Enter demeniz yeterli.

Bu tutorial boyunca, sizlere Marvel -> Sense üzerinden Curl requestleri kullanarak elastic üzerinde işlem yapma konusunda bilgi aktarımı sağlayacağım. Bu nedenle sizlere önceki yazımda anlattığım Marvel plugin’ini kurmayı şiddetle tavsiye ediyorum.

Screen Shot 2015-07-21 at 22.33.40

CRUD

İlk aşama olarak her ne kadar Elastic’i arama işlemleri için kullanmayı istesek de, ilk aşamada yapmamız gereken, bir index populate etmek ve içerisine data yerleştirmek. Elastic açısından aslında CRUD işlemi bir indexleme işlemidir ve ilk öğrenmemiz gereken şey, update, read, delete ve create işlemlerinin nasıl olduğudur.

Indexleme İşlemi Ne Demektir ?

Elasticsearch için indexleme işlemi, CRUD metninin içerisinde geçen iki harfin yani “Create” ve “Update” in karşılığıdır. Eğer bir dökümanı bir type ve document id ile indexlersek, aslında eğer böyle bir döküman yoksa ekleme yapılır, ya da aynı tip ve document id içeren bir kayıt varsa bu durumda da overwrite işlemi yapılır yani mevcut silinir, üzerine yazma işlemi yapılır.

Dilerseniz hep birlikte, ilk indexleme işlemimizi yapalım. HTTP açısından bir JSON objemizi Elastic Engine’e göndermek için POST ya da PUT request göndermemiz gerekmektedir. Eğer dökümanın ID değerini biliyorsak, bu durumda PUT, bilmiyorsak POST kullanmamız gerekiyor.

Gelin index, type, document id terimleri iyice kafamızı karıştırmadan önce bir bu terimlere değinelim.

Index

An index is like a database in a relational database. It has a mapping which defines multiple types. An index is a logical namespace which maps to one or more primary shards and can have zero or more replica shards.

Index, relational bir veritabandaki veritabanına benzer anlam taşır. İçerisinde çok sayıda type barındırabilir. Bir index aslında, bir ya da daha fazla shard’ın mantıksal namespace’i anlamına gelmektedir. Elasticsearch’e bir indexleme işlemi yapılırken, ilgili index henüz yaratılmamış ise, Elastic kendisi bu indexi otomatik olarak yaratır.

Type

A type is like a table in a relational database. Each type has a list of fields that can be specified for documents of that type. The mapping defines how each field in the document is analyzed.

Type aslında, ilişkisel bir veritabanındaki tablolara benzemektedir. Her bir type içerisinde field listesi barındırır ve ilgili type’a özeldir. Elasticsearch indexleme sürecindeki mapping süreci aslında, type içerisindeki field’lerin nasıl analiz edildiği ile ilgilidir.

Document

A document is a JSON document which is stored in elasticsearch. It is like a row in a table in a relational database. Each document is stored in an index and has a type and an id. A document is a JSON object (also known in other languages as a hash / hashmap / associative array) which contains zero or more fields, or key-value pairs. The original JSON document that is indexed will be stored in the _source field, which is returned by default when getting or searching for a document.

Document aslında bir JSON metninin Elastic’de tutulan haline deniyor. Nasıl index database i , type o database in içerisindeki bir tabloyu ve field o tablonun sütunlarını ifade ediyorsa, document’de tablodaki bir satırı ifade ediyor. Her bir döküman aslında index + type + id den oluşan bir bilgi anlamına geliyor. Elastic ile aklınıza gelen tüm JSON metinlerini indexlemeniz mümkündür.

Field

A document contains a list of fields, or key-value pairs. The value can be a simple (scalar) value (eg a string, integer, date), or a nested structure like an array or an object. A field is similar to a column in a table in a relational database. The mapping for each field has a field type (not to be confused with document type) which indicates the type of data that can be stored in that field, eg integer, string, object. The mapping also allows you to define (amongst other things) how the value for a field should be analyzed.

Bir döküman, aslında bir tablodaki bir satırı ifade eder dediğimize göre, bu tablodaki sütunları ifade eden döküman, aslında field listesinden meydana gelmektedir. Herhangi bir field’a gelen değer, bir simple data da olabilir (integer, long, date, string vb. ) , kompleks bir tip de olabilir (array ya da obje vb.). Yani field, bir tablodaki sütunlar anlamına gelmektedir. Field’lar map edilirken, her bir field’in tipi, Elastic tarafından otomatik olarak algılanır.

İlk Index

Terimlerin anlamlarını da kavradığımıza göre, pratik kazanmak için ilk request’imizi gönderelim.

Bu request içerisinde library -> index , books -> type ve 1 -> document id anlamına gelmektedir. İlgili dökümanın fieldları, title, name.first, name.last, publish_date ve price ‘dır.

Bu çağrıyı Elastic’e yaptığımız anda aşağıdaki yanıtı alırız;

Read more