Dinamik Web API geliştirme (Python & Flask)
Published: 2020-10-09 09:21:59

## Başlıklar
  * [API Nedir?](#chapter-1)
  * [Web API Nedir?](#chapter-2)
  * [Kurulum](#chapter-3)
  * [Dinamik 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.

Daha önce flask ile Web API yapıp, statik bir şekilde veri aktarmayı işlemiştik. Eğer o dokümanı görmediyseniz [buradan](https://dev.to/koraybarkin/python-ve-flask-kullanarak-web-api-gelistirme-5ed7) ulaşabilirsiniz.

Şimdi ise dinamik bir şekilde hem URL hem de veriyi alan bir Web API yapalım. Bu API’da Google Maps’in API’ını da kullanacağız. 

### **Dinamik Web API Geliştirme** <a name="chapter-4"></a>

Şimdi ise gönderilen konuma göre Google Maps’in API’ından harita ve konum görüntüsünü yansıtan bir API yapalım. Dünyadaki tüm şehirlerin harita görüntüsünü elimizde tutmamız neredeyse imkansız. Bu nedenle bu tarz bir geliştirmeyi statik olarak yapmamız olanaksız. Neyse ki bizim için bütün şehirlerin hem harita hem de konum görüntülerini tutan Google Maps API’ı bulunmakta. Biz de bu API aracılığı ile veriyi Google Maps’ten çekip, bizim gönderdiğimiz şehrin görüntüsünü elde edeceğiz.

Bir python dosyası açalım ve içerisine aşağıdaki kodu yapıştıralım.

```python
from flask import Flask
from string import Template
app = Flask(__name__)

HTML_TEMPLATE = Template("""
<h1>Hello ${place_name}!</h1>

<img src="https://maps.googleapis.com/maps/api/staticmap?size=700x300&markers=${place_name}" alt="map of ${place_name}">

<img src="https://maps.googleapis.com/maps/api/streetview?size=700x300&location=${place_name}" alt="street view of ${place_name}">
""")

@app.route('/')
def homepage():
    return """<h1>Hello world!</h1>"""

@app.route('/<some_place>')
def some_place_page(some_place):
    return(HTML_TEMPLATE.substitute(place_name=some_place))

if __name__ == '__main__':
    app.run(debug=False, use_reloader=True)
```

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)```

http://127.0.0.1:5000/ adresindeki konuma gidip, index sayfasını görebiliriz.

Şimdi burada tam olarak ne oluyor? HTML_TEMPLATE, içerisinde gördüğünüz gibi bir URL tutmaktadır. Bu URL Google Maps’e bir request atıyor ve biz de istenilen request’i serverdan respond olarak alıyoruz. Peki neyin request’ini gönderiyoruz? Kısacası place_name yerine ne yazarsak o konumun görüntüsünü elde edeceğiz. Bizim API’ımızı da dinamik yapan asıl durum tam olarak da budur. Hiçbir şehrin görüntüsünü tek tek indirip girmedik, hepsi hazırda duruyor ve bizim talebimize göre o veriyi elde ediyoruz. 

Bu geliştirdiğimiz API’da bir tek dinamik olan durum görüntüler değil, URL’yi de dinamik bir şekilde alabiliriz. 

**@app.route(‘/’)** bildiğiniz gibi ana sayfayı yani index sayfasını temsil etmekteydi. Eğer biz oraya **@app.route(‘/Ankara’)** yazsaydık ve tek tek her şehir için böyle bir tanımda bulunsaydık bu dinamik değil statik olurdu. O yüzden **<some_places>** adında bir değer tanımlıyoruz. Bu değere gönderdiğimiz isim Google Maps API’na **place_name** olarak gitmektedir ve oradan da konum bilgilerini çekmektedir. 

Böylece hem URL hem de veriyi dinamik bir şekilde elde etmiş olduk!