Python ve Flask kullanarak Web API geliştirme
Published: 2020-10-09 07:07:13

## Başlıklar
  * [API Nedir?](#chapter-1)
  * [Web API Nedir?](#chapter-2)
  * [Kurulum](#chapter-3)
  * [Web API Geliştirme](#chapter-4)


### **API Nedir?** <a name="chapter-1"></a>
API yani Application Programming Interface’in Türkçe karşılığı Uygulama Geliştirme Ara yüzü anlamına gelmektedir. Kişinin elindeki verileri dış dünyaya açarak diğer uygulama ve platformların kullanımına belli kurallar ve tanımlamalar çerçevesinde sunduğu ara yüzdür.

### **Web API Nedir?** <a name="chapter-2"></a>
Birden fazla end user’ın bilgisayarlar, web tarayıcıları, akıllı telefonlar, tabletler vs. aracılığı HTTP protokolleri üzerinden haberleşelebilen bir servis oluşturmak için kullanılan bir framework olarak çalışmaktadır.
HTTP’nin tüm özelliklerini (URI, Request/Response headers, caching yani önbelleğe alma, versiyonlama, çeşitli içerik formatları gibi özellikler)  kullanabilen, HTTP üzerinde kaynak odaklı servisler oluşturmak istediğinizde Web API kullanmanız daha sağlıklıdır.
### **Kurulum** <a name="chapter-3"></a>
Öncelikle Python’da oldukça popüler olan pip3 paket yöneticisini kuralım. Eğer pip3 yüklüyse bu adımı geçebilirsiniz.
```bash
sudo apt-get install python3-pip
```
Şimdi ise pip ile Flask kurmaya hazırız.
```bash
pip install flask
```
Kurulumumuzu tamamladık, şimdi bu dökümanda ne yapacağımızdan kısaca bir bahsedelim.

### **Web API Geliştirme** <a name="chapter-4"></a>
Her siteye girdiğinizde base URL dediğimiz ana sayfa bulunmaktadır. Sizin yaptığınız tercihler ile farklı konumlara request atılır ve bu base URL’in sonuna bir path eklenir. 

Base URL:
```
dev.to
```

Örneğin, dev.to sitesine girdiğinizde ana sayfaya yönlendirilirsiniz. Fakat benim profilime girmek için adıma tıkladığınızda URL’nin sonuna aşağıdaki path’in eklendiğini görebilirsiniz.

```
/koraybarkin
```

Bu path kendi başına hiçbir işe yaramamaktadır, fakat base URL’imiz ile birleştiğinde dev.to sitesinde koraybarkin kullanıcısının profiline yönlendirmektedir.

```url
https://dev.to/koraybarkin
```

Şimdi başka bir örnekten daha detaylı inceleyelim. 

```
http://chroniclingamerica.loc.gov/search/pages/results/
```

Yukarıdaki URL’nin sonuna bir path eklenmiş ve bir sorgunun cevabı yansıtılmış. Şimdi ise parametre göndermenin ne işe yaradığını öğrenelim. Bu sitedeki aramamızın sonucunu parametre göndererek manipüle edebiliriz. 

```
http://chroniclingamerica.loc.gov/search/pages/results/?format=json&proxtext=fire
```

Yukarıda görmüş olduğunuz gibi “?” işareti her bir query parametresinin başında yer yer almaktadır. Her bir query, & işareti ile birbirinden ayrılmaktadır. Yukarıdaki format=json query’si sayfadaki veriyi bize JSON halinde göstermesi için bir sorgudur. İkinci olarak da proxtext=fire sorgusu o sayfada yaptığımız aramayı spefisikleştirmektedir. 

Şimdi bu terminolojileri anladığımıza göre Flask ile basit bir API yapalım.
İlk önce bir klasör açalım ve adına projeler diyelim. Daha sonra bu projeler klasörünün içerisine api adında bir klasör daha açalım ve bu api klasörünün içerisine de bir Python dosyası açalım (.py uzantılı) ve içerisine aşağıdaki kodu yapıştıralım.

```python
import flask

app = flask.Flask(__name__)
app.config["DEBUG"] = False


@app.route('/', methods=['GET'])
def home():
    return "<h1>dev.to/koraybarkin Flask ile Web API geliştirme</h1><p>Tebrikler ilk Web API'ınızı başarıyla geliştirdiniz!</p>"

app.run()
```
Daha sonra yaptığımız değişiklikleri kaydedip çalıştıralım. Her şey düzgün gittiyse aşağıdaki gibi bir sonuç almalısınız.

```* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)```

Şimdi çıktımızda yazan http://127.0.0.1:5000/ adresine gittiğimizde aşağıdaki gibi bir ekrana ulaşıyor olmalısınız.

Şimdi ise bu yarattığımız basit Web API’ına veri gönderelim. Aşağıdaki kodu python dosyamıza yapıştıralım ve değişiklikleri kaydedelim. Daha sonra tekrar çalıştırdığımızda ana sayfamızdaki yazının hala aynı şekilde kaldığını görebiliriz. Peki bu eklediğimiz books array’indeki data nereye gitti? Kodu dikkatlice incelerseniz giriş ekranına bir **/api/v1/resources/books/all** path’ine jsonify(books) fonksiyonunu gönderdiğimizi görebilirsiniz.

```python
import flask
from flask import request, jsonify

app = flask.Flask(__name__)
app.config["DEBUG"] = False

# Create some test data for our catalog in the form of a list of dictionaries.
books = [
    {'id': 0,
     'title': 'A Fire Upon the Deep',
     'author': 'Vernor Vinge',
     'first_sentence': 'The coldsleep itself was dreamless.',
     'year_published': '1992'},
    {'id': 1,
     'title': 'The Ones Who Walk Away From Omelas',
     'author': 'Ursula K. Le Guin',
     'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.',
     'published': '1973'},
    {'id': 2,
     'title': 'Dhalgren',
     'author': 'Samuel R. Delany',
     'first_sentence': 'to wound the autumnal city.',
     'published': '1975'}
]


@app.route('/', methods=['GET'])
def home():
    return '''<h1>dev.to/koraybarkin Flask ile Web API geliştirme</h1><p>Tebrikler ilk Web API'ınızı başarıyla geliştirdiniz!</p>'''


# A route to return all of the available entries in our catalog.
@app.route('/api/v1/resources/books/all', methods=['GET'])
def api_all():
    return jsonify(books)

app.run()
```
Şimdi ise aşağıdaki path’i yazıp sonuca bakalım.

```
http://127.0.0.1:5000/api/v1/resources/books/all
```

Books array’indeki tüm veriyi alıp, jsonify() fonksiyonu ile json haline getirdik ve ekranımıza yansıttık. İşte statik bir şekilde veriyi gönderme, API oluşturma bu kadar basit!