{"id":33630,"date":"2025-11-05T08:45:47","date_gmt":"2025-11-05T05:45:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/"},"modified":"2025-11-05T08:45:47","modified_gmt":"2025-11-05T05:45:47","slug":"bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/","title":{"rendered":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API&#8217;yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, uygulamalar\u0131n birbiriyle konu\u015fmas\u0131 adeta bir zorunluluk haline geldi. \u0130\u015fte tam da bu noktada, <b>REST API<\/b>&#8216;ler (Representational State Transfer Application Programming Interface) devreye giriyor. REST API, farkl\u0131 sistemlerin HTTP protokol\u00fc \u00fczerinden birbirleriyle g\u00fcvenli ve standart bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan mimari bir yakla\u015f\u0131md\u0131r. Web taray\u0131c\u0131n\u0131zdan mobil uygulaman\u0131za, hatta ak\u0131ll\u0131 ev cihazlar\u0131n\u0131za kadar, g\u00f6rd\u00fc\u011f\u00fcn\u00fcz veya kulland\u0131\u011f\u0131n\u0131z hemen her \u015feyin arkas\u0131nda genellikle bir REST API bulunur.<\/p>\n<p>Peki, bir API&#8217;yi &#8220;bir g\u00fcn i\u00e7inde&#8221; olu\u015fturmak neden bu kadar \u00f6nemli? Zaman, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda en de\u011ferli kaynaklardan biridir. Bir fikri h\u0131zl\u0131ca prototiplemek, kavram kan\u0131t\u0131 (proof of concept) sunmak veya yeni bir beceriyi h\u0131zla kazanmak istedi\u011finizde, g\u00fcnler veya haftalar harcamak yerine, birka\u00e7 saat i\u00e7inde i\u015flevsel bir \u00e7\u0131kt\u0131 elde etmek size inan\u0131lmaz bir avantaj sa\u011flar. Bu, \u00f6zellikle startup ekosisteminde, freelance projelerde veya bir \u00fcr\u00fcn\u00fcn MVP (Minimum Viable Product) a\u015famas\u0131nda kritik bir rol oynar. H\u0131zl\u0131 iterasyon ve geri bildirim d\u00f6ng\u00fcs\u00fc, \u00fcr\u00fcn geli\u015ftirmenin temel ta\u015flar\u0131ndand\u0131r ve bir g\u00fcnde API olu\u015fturma yetene\u011fi bu d\u00f6ng\u00fcy\u00fc h\u0131zland\u0131r\u0131r.<\/p>\n<p>\u00dcstelik, bu s\u00fcre\u00e7 size sadece teknik bilgi kazand\u0131rmakla kalmaz, ayn\u0131 zamanda bir \u00fcr\u00fcn\u00fcn temelini atman\u0131n ne kadar pratik olabilece\u011fini de g\u00f6sterir. Karma\u015f\u0131k g\u00f6r\u00fcnen s\u00fcre\u00e7leri basitle\u015ftirme ve odaklanma becerisi geli\u015ftirmenize yard\u0131mc\u0131 olur. Ayr\u0131ca, bu rehber sayesinde <b>backend geli\u015ftirme<\/b> d\u00fcnyas\u0131na sa\u011flam bir ad\u0131m atm\u0131\u015f olacak, HTTP metodlar\u0131 (GET, POST, PUT, DELETE), JSON veri format\u0131 ve endpoint kavramlar\u0131 gibi temel ta\u015flar\u0131 bizzat deneyimleyerek \u00f6\u011freneceksiniz. Bu deneyim, kariyerinizin ilerleyen a\u015famalar\u0131nda daha b\u00fcy\u00fck ve karma\u015f\u0131k sistemler tasarlarken size paha bi\u00e7ilmez bir referans noktas\u0131 sunacakt\u0131r. K\u0131sacas\u0131, bir g\u00fcnde bir REST API in\u015fa etmek, sadece teknik bir ba\u015far\u0131 de\u011fil, ayn\u0131 zamanda h\u0131z, verimlilik ve \u00f6\u011frenme azminin de bir g\u00f6stergesidir.<\/p>\n<h2>Hangi Ara\u00e7larla Yola \u00c7\u0131kmal\u0131y\u0131z? Temel Teknoloji Se\u00e7imleri<\/h2>\n<p>Bir g\u00fcnde basit bir REST API olu\u015fturmak i\u00e7in do\u011fru ara\u00e7lar\u0131 se\u00e7mek, yolculu\u011fun en kritik ad\u0131mlar\u0131ndan biridir. Bu se\u00e7im, hem \u00f6\u011frenme e\u011frisini hem de geli\u015ftirme h\u0131z\u0131n\u0131 do\u011frudan etkiler. Amac\u0131m\u0131z, h\u0131zl\u0131ca aya\u011fa kald\u0131rabilece\u011fimiz, kolay anla\u015f\u0131l\u0131r ve geni\u015f topluluk deste\u011fine sahip teknolojiler kullanmakt\u0131r. Bu ba\u011flamda, Python ve Node.js ekosistemleri, h\u0131zl\u0131 API geli\u015ftirme i\u00e7in \u00f6ne \u00e7\u0131kan iki g\u00fc\u00e7l\u00fc adrestir. Her ikisi de zengin k\u00fct\u00fcphane ekosistemine, esnek yap\u0131ya ve d\u00fc\u015f\u00fck ba\u015flang\u0131\u00e7 maliyetine sahiptir.<\/p>\n<h3>Python ile Flask: H\u0131zl\u0131 ve Etkili Bir Se\u00e7enek<\/h3>\n<p>Python, okunabilirli\u011fi y\u00fcksek s\u00f6zdizimi ve geni\u015f k\u00fct\u00fcphane deste\u011fiyle pop\u00fcler bir se\u00e7imdir. E\u011fer veri bilimi, yapay zeka veya genel ama\u00e7l\u0131 komut dosyalar\u0131yla zaten ha\u015f\u0131r ne\u015fir iseniz, Python ile devam etmek mant\u0131kl\u0131 olacakt\u0131r. Flask, Python i\u00e7in geli\u015ftirilmi\u015f, minimalist bir mikro web \u00e7er\u00e7evesidir. Django gibi b\u00fcy\u00fck bir \u00e7er\u00e7eveye g\u00f6re \u00e7ok daha az soyutlama sunar, bu da \u00f6\u011frenmeyi kolayla\u015ft\u0131r\u0131r ve projeyi h\u0131zla ba\u015flatman\u0131z\u0131 sa\u011flar. Flask ile sadece birka\u00e7 sat\u0131r kodla bir HTTP endpoint&#8217;i tan\u0131mlayabilir, veri i\u015fleyebilir ve JSON yan\u0131tlar\u0131 d\u00f6nd\u00fcrebilirsiniz. Veritaban\u0131 olarak, kurulum gerektirmeyen ve hafif bir se\u00e7enek olan <b>SQLite<\/b> idealdir. SQLAlchemy ORM (Object-Relational Mapper) ise Python nesneleriyle veritaban\u0131 i\u015flemlerini kolayca yapman\u0131z\u0131 sa\u011flar, b\u00f6ylece SQL sorgular\u0131 yazmak zorunda kalmazs\u0131n\u0131z. Bu kombinasyon, bir g\u00fcnde i\u015flevsel bir API olu\u015fturmak i\u00e7in m\u00fckemmel bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar.<\/p>\n<h3>Node.js ile Express: JavaScript D\u00fcnyas\u0131ndan G\u00fc\u00e7l\u00fc Bir Alternatif<\/h3>\n<p>E\u011fer frontend geli\u015ftirme ge\u00e7mi\u015finiz varsa veya JavaScript&#8217;e hakimseniz, Node.js ve Express.js ikilisi sizin i\u00e7in daha uygun olabilir. Node.js, JavaScript&#8217;i taray\u0131c\u0131 d\u0131\u015f\u0131nda \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131yan bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Express.js ise Node.js i\u00e7in minimalist ve esnek bir web uygulama \u00e7er\u00e7evesidir. Express, y\u00f6nlendirme (routing), ara yaz\u0131l\u0131m (middleware) ve temel HTTP i\u015flemleri i\u00e7in zengin bir dizi \u00f6zellik sunar. JavaScript&#8217;in asenkron do\u011fas\u0131, \u00f6zellikle G\/\u00c7 (giri\u015f\/\u00e7\u0131k\u0131\u015f) yo\u011fun uygulamalarda, yani veritaban\u0131 veya a\u011f i\u015flemleri gibi durumlarda y\u00fcksek performans sa\u011flar. Veritaban\u0131 olarak, yine kurulumu kolay ve esnek bir se\u00e7enek olan <b>MongoDB<\/b> veya <b>NeDB<\/b> (JavaScript tabanl\u0131, dosya sisteminde depolanan SQLite benzeri bir veritaban\u0131) tercih edilebilir. Bu sayede, t\u00fcm geli\u015ftirme s\u00fcrecini tek bir dilde, JavaScript&#8217;te y\u00fcr\u00fctebilir, \u00f6\u011frenme ve ba\u011flam de\u011fi\u015ftirme y\u00fck\u00fcn\u00fc en aza indirebilirsiniz. Her iki se\u00e7enekte de anahtar, projenin kapsam\u0131n\u0131 dar tutmak ve temel <b>CRUD (Create, Read, Update, Delete)<\/b> operasyonlar\u0131na odaklanmakt\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m REST API Geli\u015ftirme: Fikir A\u015famas\u0131ndan \u0130lk Endpoint&#8217;e<\/h2>\n<p>Bir g\u00fcn i\u00e7inde basit bir REST API olu\u015fturma yolculu\u011fumuzun en heyecan verici k\u0131sm\u0131, kollar\u0131 s\u0131vay\u0131p kod yazmaya ba\u015flamak. Bu b\u00f6l\u00fcmde, se\u00e7ti\u011fimiz Python ve Flask kombinasyonu \u00fczerinden ilerleyerek, API&#8217;nizi ad\u0131m ad\u0131m nas\u0131l aya\u011fa kald\u0131raca\u011f\u0131n\u0131z\u0131 g\u00f6sterece\u011fiz. Unutmay\u0131n, \u00f6nemli olan s\u00fcreci anlamak ve ilk \u00e7\u0131kt\u0131y\u0131 almakt\u0131r; detaylar ve optimizasyonlar daha sonra gelebilir. \u00d6ncelikle, projenizin temelini ataca\u011f\u0131m\u0131z bir ortam kurmal\u0131y\u0131z.<\/p>\n<h3>Proje Kurulumu ve Sanal Ortam Olu\u015fturma<\/h3>\n<p>Herhangi bir Python projesinde oldu\u011fu gibi, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemek i\u00e7in bir sanal ortam olu\u015fturmak en iyi uygulamad\u0131r. Komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<pre><code class=\"language-bash\">\nmkdir my_simple_api\ncd my_simple_api\npython3 -m venv venv\nsource venv\/bin\/activate  # macOS\/Linux\n# venv\\Scripts\\activate.bat  # Windows\npip install Flask Flask-SQLAlchemy\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar, projeniz i\u00e7in bir klas\u00f6r olu\u015fturacak, bir sanal ortam etkinle\u015ftirecek ve Flask ile Flask-SQLAlchemy k\u00fct\u00fcphanelerini kuracakt\u0131r. Flask-SQLAlchemy, Flask uygulamalar\u0131n\u0131zla SQLAlchemy'yi entegre etmeyi kolayla\u015ft\u0131ran bir uzant\u0131d\u0131r ve veritaban\u0131 i\u015flemlerini basitle\u015ftirecektir.<\/p>\n<h3>Veri Modeli Tan\u0131mlama ve Veritaban\u0131 Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>API'nizin ne t\u00fcr verilerle \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirlemek, temel bir ad\u0131md\u0131r. Bir \"Yap\u0131lacaklar Listesi\" (Todo List) API'si olu\u015fturdu\u011fumuzu varsayal\u0131m. Her bir yap\u0131lacak \u00f6\u011fenin bir ba\u015fl\u0131\u011f\u0131, a\u00e7\u0131klamas\u0131 ve tamamlan\u0131p tamamlanmad\u0131\u011f\u0131 bilgisini i\u00e7eren basit bir veri modeline ihtiyac\u0131m\u0131z var. <code>app.py<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki kodlar\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-python\">\nfrom flask import Flask, request, jsonify\nfrom flask_sqlalchemy import SQLAlchemy\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/todos.db' # SQLite veritaban\u0131\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\ndb = SQLAlchemy(app)\n\nclass Todo(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    title = db.Column(db.String(80), nullable=False)\n    description = db.Column(db.String(120), nullable=True)\n    completed = db.Column(db.Boolean, default=False)\n\n    def __repr__(self):\n        return f'<Todo {self.title}>'\n\n    def to_dict(self):\n        return {\n            'id': self.id,\n            'title': self.title,\n            'description': self.description,\n            'completed': self.completed\n        }\n\nwith app.app_context():\n    db.create_all() # Veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftur\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, Flask uygulamas\u0131n\u0131 ba\u015flat\u0131r, SQLite veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 yap\u0131land\u0131r\u0131r ve <code>Todo<\/code> ad\u0131nda bir veritaban\u0131 modeli (tablosu) tan\u0131mlar. <code>to_dict<\/code> metodu, veritaban\u0131ndan gelen nesneleri JSON format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131\u015fl\u0131 olacakt\u0131r. <code>db.create_all()<\/code> komutu ise uygulaman\u0131z ilk \u00e7al\u0131\u015ft\u0131\u011f\u0131nda veritaban\u0131 \u015femas\u0131n\u0131 otomatik olarak olu\u015fturur.<\/p>\n<h3>\u0130lk Endpoint'i Olu\u015fturma: T\u00fcm Yap\u0131lacaklar\u0131 Listeleme (GET)<\/h3>\n<p>\u015eimdi s\u0131ra, API'mizin ilk i\u015flevini hayata ge\u00e7irmeye geldi: t\u00fcm yap\u0131lacaklar listesini getiren bir endpoint. Bu, HTTP GET metodunu kullanacak basit bir routad\u0131r. <code>app.py<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-python\">\n@app.route('\/todos', methods=['GET'])\ndef get_todos():\n    todos = Todo.query.all()\n    return jsonify([todo.to_dict() for todo in todos])\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, <code>\/todos<\/code> adresine gelen GET isteklerini kar\u015f\u0131lar. Veritaban\u0131ndaki t\u00fcm <code>Todo<\/code> nesnelerini sorgular ve her birini <code>to_dict()<\/code> metoduyla Python s\u00f6zl\u00fc\u011f\u00fcne d\u00f6n\u00fc\u015ft\u00fcrd\u00fckten sonra, bu s\u00f6zl\u00fck listesini <code>jsonify<\/code> fonksiyonuyla JSON format\u0131nda d\u00f6nd\u00fcr\u00fcr. <code>app.run(debug=True)<\/code> ile uygulamay\u0131 debug modunda \u00e7al\u0131\u015ft\u0131rabilirsiniz. Uygulaman\u0131z\u0131 ba\u015flatmak i\u00e7in terminalde <code>python app.py<\/code> komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir. Art\u0131k taray\u0131c\u0131n\u0131zdan veya Postman gibi bir ara\u00e7la <code>http:\/\/127.0.0.1:5000\/todos<\/code> adresine giderek bo\u015f bir yap\u0131lacaklar listesi g\u00f6rebilirsiniz. Tebrikler, ilk <b>REST API endpoint<\/b>'inizi ba\u015far\u0131yla olu\u015fturdunuz!<\/p>\n<h2>Veritaban\u0131 Entegrasyonu ve Veri Y\u00f6netimi: API'nizin Kalbi<\/h2>\n<p>Bir REST API'nin temel amac\u0131, veri al\u0131\u015fveri\u015fini sa\u011flamakt\u0131r. Bu nedenle, veritaban\u0131 entegrasyonu ve verinin etkin bir \u015fekilde y\u00f6netilmesi, API'nizin kalbini olu\u015fturur. \u00d6nceki b\u00f6l\u00fcmde temel bir veritaban\u0131 modeli tan\u0131mlad\u0131k ve t\u00fcm verileri getiren bir endpoint olu\u015fturduk. \u015eimdi ise, <b>CRUD (Create, Read, Update, Delete)<\/b> operasyonlar\u0131n\u0131n geri kalan\u0131n\u0131 API'mize ekleyerek tam i\u015flevselli\u011fe kavu\u015faca\u011f\u0131z. Bu sayede, kullan\u0131c\u0131lar yeni yap\u0131lacaklar ekleyebilecek, mevcutlar\u0131 g\u00fcncelleyebilecek ve silebilecekler.<\/p>\n<h3>Yeni Bir Kay\u0131t Olu\u015fturma (POST)<\/h3>\n<p>API'nize yeni bir \"yap\u0131lacak\" \u00f6\u011fesi eklemek i\u00e7in HTTP POST metodunu kullanaca\u011f\u0131z. Kullan\u0131c\u0131dan gelen verileri (genellikle JSON format\u0131nda) almam\u0131z ve bunlar\u0131 veritaban\u0131na kaydetmemiz gerekecek. <code>app.py<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-python\">\n@app.route('\/todos', methods=['POST'])\ndef create_todo():\n    data = request.get_json()\n    if not data or not 'title' in data:\n        return jsonify({'error': 'Title is required!'}), 400 # Hatal\u0131 istek\n\n    new_todo = Todo(\n        title=data['title'],\n        description=data.get('description'),\n        completed=data.get('completed', False)\n    )\n    db.session.add(new_todo)\n    db.session.commit()\n    return jsonify(new_todo.to_dict()), 201 # Olu\u015fturuldu (Created)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu endpoint, <code>\/todos<\/code> adresine gelen POST isteklerini i\u015fler. <code>request.get_json()<\/code> ile gelen JSON verilerini al\u0131r\u0131z. Basit bir do\u011frulama yaparak <code>title<\/code> alan\u0131n\u0131n mevcut olup olmad\u0131\u011f\u0131n\u0131 kontrol ederiz. E\u011fer yoksa, 400 Bad Request hatas\u0131 d\u00f6nd\u00fcr\u00fcr\u00fcz. Ard\u0131ndan, yeni bir <code>Todo<\/code> nesnesi olu\u015fturur, veritaban\u0131na ekler (<code>db.session.add<\/code>) ve de\u011fi\u015fiklikleri kaydederiz (<code>db.session.commit<\/code>). Son olarak, olu\u015fturulan \u00f6\u011feyi 201 Created durum koduyla birlikte JSON olarak d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu, ba\u015far\u0131l\u0131 bir kaynak olu\u015fturma i\u015fleminin standart cevab\u0131d\u0131r.<\/p>\n<h3>Belirli Bir Kayd\u0131 Getirme (GET by ID)<\/h3>\n<p>Tek bir yap\u0131lacak \u00f6\u011fesini detayl\u0131 olarak g\u00f6rmek i\u00e7in, \u00f6\u011fenin ID'sini kullanarak bir GET iste\u011fi yapaca\u011f\u0131z. Bu, URL yap\u0131m\u0131zda dinamik bir parametre kullanaca\u011f\u0131m\u0131z anlam\u0131na gelir:<\/p>\n<pre><code class=\"language-python\">\n@app.route('\/todos\/<int:todo_id>', methods=['GET'])\ndef get_todo(todo_id):\n    todo = Todo.query.get_or_404(todo_id) # ID yoksa 404 d\u00f6nd\u00fcr\n    return jsonify(todo.to_dict())\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>\/<int:todo_id><\/code> yap\u0131s\u0131 Flask'e, bu yolun integer tipinde bir <code>todo_id<\/code> parametresi alaca\u011f\u0131n\u0131 s\u00f6yler. <code>Todo.query.get_or_404(todo_id)<\/code> metodu, e\u011fer belirtilen ID'ye sahip bir \u00f6\u011fe bulunamazsa otomatik olarak 404 Not Found hatas\u0131 d\u00f6nd\u00fcr\u00fcr, bu da hata y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Bulunursa, \u00f6\u011fenin detaylar\u0131n\u0131 JSON olarak d\u00f6nd\u00fcr\u00fcr\u00fcz.<\/p>\n<h3>Mevcut Bir Kayd\u0131 G\u00fcncelleme (PUT)<\/h3>\n<p>Bir yap\u0131lacak \u00f6\u011fesini g\u00fcncellemek i\u00e7in HTTP PUT metodunu kullanaca\u011f\u0131z. Yine ID ile \u00f6\u011feyi bulup, gelen verilerle g\u00fcncelleme yapaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-python\">\n@app.route('\/todos\/<int:todo_id>', methods=['PUT'])\ndef update_todo(todo_id):\n    todo = Todo.query.get_or_404(todo_id)\n    data = request.get_json()\n\n    todo.title = data.get('title', todo.title)\n    todo.description = data.get('description', todo.description)\n    todo.completed = data.get('completed', todo.completed)\n\n    db.session.commit()\n    return jsonify(todo.to_dict())\n<\/pre>\n<p><\/code><\/p>\n<p>Bu endpoint, yine ID ile \u00f6\u011feyi bulur. Gelen JSON verilerindeki alanlar\u0131 kontrol eder ve sadece mevcut olanlar\u0131 g\u00fcncelleriz (<code>data.get('field', todo.field)<\/code> kullan\u0131m\u0131 sayesinde). B\u00f6ylece, sadece belirli alanlar\u0131 g\u00fcncellemek de m\u00fcmk\u00fcn olur. G\u00fcncelleme sonras\u0131 de\u011fi\u015fiklikleri veritaban\u0131na kaydeder ve g\u00fcncellenmi\u015f \u00f6\u011feyi d\u00f6nd\u00fcr\u00fcr\u00fcz.<\/p>\n<h3>Bir Kayd\u0131 Silme (DELETE)<\/h3>\n<p>Son olarak, bir yap\u0131lacak \u00f6\u011fesini silmek i\u00e7in HTTP DELETE metodunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-python\">\n@app.route('\/todos\/<int:todo_id>', methods=['DELETE'])\ndef delete_todo(todo_id):\n    todo = Todo.query.get_or_404(todo_id)\n    db.session.delete(todo)\n    db.session.commit()\n    return jsonify({'message': 'Todo deleted successfully!'}), 204 # \u0130\u00e7erik Yok (No Content)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu endpoint, belirtilen ID'ye sahip \u00f6\u011feyi bulur, veritaban\u0131ndan siler ve de\u011fi\u015fiklikleri kaydeder. Ba\u015far\u0131l\u0131 bir silme i\u015flemi genellikle 204 No Content durum kodu ile yan\u0131tlan\u0131r, \u00e7\u00fcnk\u00fc silme i\u015flemi sonras\u0131 d\u00f6nd\u00fcr\u00fclecek bir i\u00e7erik yoktur. Bu d\u00f6rt temel operasyonla, API'niz tam bir veri y\u00f6netimi yetene\u011fi kazanm\u0131\u015f olur. Art\u0131k bir g\u00fcn i\u00e7inde basit bir REST API'nin temel i\u015flevselli\u011fini olu\u015fturdunuz ve verilerle etkile\u015fim kurabilirsiniz. Bu, <b>API geli\u015ftirme<\/b> s\u00fcrecinde b\u00fcy\u00fck bir ad\u0131md\u0131r.<\/p>\n<h2>API'nizi Test Etmek ve G\u00fcvenceye Almak: Neden \u00d6nemli?<\/h2>\n<p>Bir REST API olu\u015fturduktan sonra, onun bekledi\u011finiz gibi \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 do\u011frulamak kritik bir ad\u0131md\u0131r. Test etmek, sadece hata ay\u0131klamak i\u00e7in de\u011fil, ayn\u0131 zamanda API'nizin kullan\u0131c\u0131lar i\u00e7in g\u00fcvenilir ve istikrarl\u0131 oldu\u011fundan emin olmak i\u00e7in de gereklidir. Ayn\u0131 zamanda, g\u00fcvenlik endi\u015feleri, bir API'nin asla g\u00f6z ard\u0131 etmemesi gereken bir konudur. Basit bir API geli\u015ftiriyor olsan\u0131z bile, temel g\u00fcvenlik prensiplerini uygulamak, gelecekteki olas\u0131 sorunlar\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n<h3>Postman ile API Testi: Geli\u015ftiricinin En \u0130yi Dostu<\/h3>\n<p>API'nizi test etmenin en pop\u00fcler ve etkili yollar\u0131ndan biri <b>Postman<\/b> gibi bir ara\u00e7 kullanmakt\u0131r. Postman, HTTP istekleri olu\u015fturman\u0131za, bunlar\u0131 API'nize g\u00f6ndermenize ve gelen yan\u0131tlar\u0131 incelemenize olanak tan\u0131yan bir masa\u00fcst\u00fc veya web uygulamas\u0131d\u0131r. Taray\u0131c\u0131n\u0131zla yaln\u0131zca GET istekleri yapabilirken, Postman ile POST, PUT, DELETE gibi t\u00fcm HTTP metodlar\u0131n\u0131 kolayca test edebilirsiniz.<\/p>\n<ol>\n<li><strong>POST \u0130ste\u011fi Yapma:<\/strong> Yeni bir \"yap\u0131lacak\" \u00f6\u011fesi olu\u015fturmak i\u00e7in, Postman'de yeni bir istek olu\u015fturun, metodunu POST olarak se\u00e7in, URL'yi <code>http:\/\/127.0.0.1:5000\/todos<\/code> olarak ayarlay\u0131n. \"Body\" sekmesinden \"raw\" ve \"JSON\" se\u00e7ene\u011fini i\u015faretleyerek a\u015fa\u011f\u0131daki JSON verisini g\u00f6nderin:\n<pre><code class=\"language-json\">\n{\n    \"title\": \"API Makalesini Bitir\",\n    \"description\": \"2000 kelimeye ula\u015fmal\u0131!\",\n    \"completed\": false\n}\n        <\/pre>\n<p><\/code><br \/>\n        G\u00f6nder d\u00fc\u011fmesine t\u0131klad\u0131\u011f\u0131n\u0131zda, API'nizin 201 Created yan\u0131t\u0131 ile yeni olu\u015fturulan \u00f6\u011feyi d\u00f6nd\u00fcrmesi gerekir.\n    <\/li>\n<li><strong>GET \u0130ste\u011fi Yapma:<\/strong> T\u00fcm \u00f6\u011feleri g\u00f6rmek i\u00e7in, metodunu GET olarak ayarlayarak ayn\u0131 URL'ye istek g\u00f6nderin. Yeni olu\u015fturdu\u011funuz \u00f6\u011feyi listede g\u00f6rmelisiniz. Belirli bir \u00f6\u011feyi ID'si ile almak i\u00e7in ise URL'yi <code>http:\/\/127.0.0.1:5000\/todos\/1<\/code> (e\u011fer ilk \u00f6\u011feniz 1 ID'sine sahipse) \u015feklinde de\u011fi\u015ftirip GET iste\u011fi yap\u0131n.\n    <\/li>\n<li><strong>PUT \u0130ste\u011fi Yapma:<\/strong> Bir \u00f6\u011feyi g\u00fcncellemek i\u00e7in, metodunu PUT olarak ayarlay\u0131n, URL'yi <code>http:\/\/127.0.0.1:5000\/todos\/1<\/code> olarak belirleyin ve \"Body\" k\u0131sm\u0131na g\u00fcncellenecek JSON verisini girin:\n<pre><code class=\"language-json\">\n{\n    \"description\": \"Makale yaz\u0131m\u0131 tamamland\u0131!\",\n    \"completed\": true\n}\n        <\/pre>\n<p><\/code><br \/>\n        API'niz g\u00fcncellenmi\u015f \u00f6\u011feyi 200 OK yan\u0131t\u0131 ile d\u00f6nd\u00fcrmelidir.\n    <\/li>\n<li><strong>DELETE \u0130ste\u011fi Yapma:<\/strong> Bir \u00f6\u011feyi silmek i\u00e7in, metodunu DELETE olarak ayarlayarak URL'ye <code>http:\/\/127.0.0.1:5000\/todos\/1<\/code> bir istek g\u00f6nderin. API'niz 204 No Content yan\u0131t\u0131 ile ba\u015far\u0131l\u0131 bir silme mesaj\u0131 d\u00f6nd\u00fcrmelidir.<\/li>\n<\/ol>\n<p>Postman'in yan\u0131 s\u0131ra, <b>Insomnia<\/b> veya taray\u0131c\u0131n\u0131n geli\u015ftirici ara\u00e7lar\u0131ndaki \"Network\" sekmesi de API testleri i\u00e7in kullan\u0131labilir. Bu ara\u00e7larla her bir endpoint'in do\u011fru HTTP durum kodlar\u0131n\u0131 d\u00f6nd\u00fcr\u00fcp d\u00f6nd\u00fcrmedi\u011fini, beklenen JSON format\u0131nda yan\u0131t verip vermedi\u011fini ve hata durumlar\u0131n\u0131 do\u011fru y\u00f6netip y\u00f6netmedi\u011fini kontrol edebilirsiniz.<\/p>\n<h3>Temel G\u00fcvenlik \u00d6nlemleri ve Do\u011frulama<\/h3>\n<p>Bir g\u00fcnde basit bir API olu\u015ftururken dahi, g\u00fcvenlik ak\u0131lda tutulmas\u0131 gereken bir unsurdur. Tam te\u015fekk\u00fcll\u00fc kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) sistemleri (\u00f6rne\u011fin JWT - JSON Web Tokens) bir g\u00fcn i\u00e7inde entegre etmek zor olsa da, baz\u0131 temel ad\u0131mlar at\u0131labilir:<\/p>\n<ol>\n<li><strong>Veri Do\u011frulama (Input Validation):<\/strong> API'nize gelen her t\u00fcrl\u00fc verinin (POST, PUT isteklerindeki JSON payload'lar\u0131) beklenen formatta ve tipte oldu\u011funu do\u011frulamak \u00e7ok \u00f6nemlidir. Yukar\u0131daki \u00f6rnekte, <code>title<\/code> alan\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 kontrol ederek basit bir do\u011frulama yapt\u0131k. Daha karma\u015f\u0131k senaryolar i\u00e7in, Flask-WTF veya Pydantic gibi k\u00fct\u00fcphaneler kullan\u0131labilir. Bu, hatal\u0131 veya k\u00f6t\u00fc niyetli verilerin veritaban\u0131n\u0131za girmesini engeller.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> API'nizin beklenmedik durumlar\u0131 (veritaban\u0131 ba\u011flant\u0131 hatas\u0131, ge\u00e7ersiz ID vb.) nas\u0131l ele ald\u0131\u011f\u0131n\u0131 belirlemek, hem kullan\u0131c\u0131 deneyimi hem de g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Her zaman anlaml\u0131 HTTP durum kodlar\u0131 (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error) ve a\u00e7\u0131klay\u0131c\u0131 hata mesajlar\u0131 d\u00f6nd\u00fcr\u00fclmelidir. Detayl\u0131 i\u00e7 hata mesajlar\u0131n\u0131 do\u011frudan kullan\u0131c\u0131ya g\u00f6ndermekten ka\u00e7\u0131n\u0131n; bunlar potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 ortaya \u00e7\u0131karabilir.<\/li>\n<li><strong>Gereksiz Bilgileri A\u00e7\u0131\u011fa \u00c7\u0131karmay\u0131n:<\/strong> Debug modunu yaln\u0131zca geli\u015ftirme a\u015famas\u0131nda kullan\u0131n. \u00dcretim ortam\u0131nda <code>debug=True<\/code> ile uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak, potansiyel g\u00fcvenlik riskleri ta\u015f\u0131r ve hassas sistem bilgilerini if\u015fa edebilir.<\/li>\n<li><strong>CORS (Cross-Origin Resource Sharing):<\/strong> E\u011fer API'niz farkl\u0131 bir domain'den (\u00f6rne\u011fin, ayr\u0131 bir frontend uygulamas\u0131) eri\u015filecekse, <b>CORS<\/b> ayarlar\u0131n\u0131 yapman\u0131z gerekecektir. Flask i\u00e7in Flask-CORS gibi bir uzant\u0131 ile bunu kolayca y\u00f6netebilirsiniz. Do\u011fru yap\u0131land\u0131r\u0131lmazsa, taray\u0131c\u0131 g\u00fcvenlik politikalar\u0131 nedeniyle API \u00e7a\u011fr\u0131lar\u0131n\u0131z engellenebilir.<\/li>\n<\/ol>\n<p>Bu temel g\u00fcvenlik ve test ad\u0131mlar\u0131, bir g\u00fcnde olu\u015fturdu\u011funuz API'nin bile sa\u011flam temellere sahip olmas\u0131n\u0131 sa\u011flar. G\u00fcvenilir ve test edilmi\u015f bir API, gelecekteki geli\u015ftirmeler i\u00e7in size g\u00fcven verir ve potansiyel sorunlar\u0131 ba\u015ftan engeller.<\/p>\n<h2>Bir G\u00fcnde API Geli\u015ftirmenin \u00d6tesi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Tebrikler! Bir g\u00fcn i\u00e7inde temel bir REST API'yi ba\u015far\u0131yla hayata ge\u00e7irdiniz. Bu rehber sayesinde, <b>backend geli\u015ftirme<\/b>nin temel ta\u015flar\u0131n\u0131 att\u0131n\u0131z ve bir fikri h\u0131zla somut bir \u00fcr\u00fcne d\u00f6n\u00fc\u015ft\u00fcrmenin ne kadar m\u00fcmk\u00fcn oldu\u011funu g\u00f6sterdiniz. Bu s\u00fcre\u00e7, sadece teknik becerilerinizi geli\u015ftirmekle kalmad\u0131, ayn\u0131 zamanda problem \u00e7\u00f6zme ve odaklanma yetene\u011finizi de g\u00fc\u00e7lendirdi. Elbette, bu sadece ba\u015flang\u0131\u00e7. Ger\u00e7ek d\u00fcnya uygulamalar\u0131 \u00e7ok daha karma\u015f\u0131k dinamiklere sahiptir, ancak edindi\u011finiz bu temel bilgi ve deneyim, daha b\u00fcy\u00fck zorluklar\u0131n \u00fcstesinden gelmeniz i\u00e7in sa\u011flam bir zemin olu\u015fturacakt\u0131r.<\/p>\n<p>\u015eimdi ne yapmal\u0131s\u0131n\u0131z? API'nizi daha da geli\u015ftirmek i\u00e7in akl\u0131n\u0131za gelen yeni \u00f6zellikleri (\u00f6rne\u011fin kullan\u0131c\u0131 kimlik do\u011frulama, daha karma\u015f\u0131k veri modelleri, sayfalama, filtreleme) eklemeye \u00e7al\u0131\u015f\u0131n. Farkl\u0131 veritabanlar\u0131 (PostgreSQL, MongoDB) veya farkl\u0131 \u00e7er\u00e7eveler (Node.js\/Express, Django, FastAPI) ile denemeler yap\u0131n. Uygulaman\u0131z\u0131 bulut sa\u011flay\u0131c\u0131lara (Heroku, AWS, Google Cloud, Azure) nas\u0131l da\u011f\u0131tabilece\u011finizi ara\u015ft\u0131r\u0131n. Unutmay\u0131n, \u00f6\u011frenme s\u00fcreci s\u00fcrekli devam eder ve her yeni deneme sizi daha yetkin bir yaz\u0131l\u0131mc\u0131 yapar. Bu deneyim, kariyer yolculu\u011funuzda \u00f6nemli bir mihenk ta\u015f\u0131 olacakt\u0131r, zira h\u0131zla de\u011fer yaratma yetene\u011fi g\u00fcn\u00fcm\u00fcz teknoloji d\u00fcnyas\u0131nda paha bi\u00e7ilmezdir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<h4>1. Bir g\u00fcnde olu\u015fturulan bir REST API \u00fcretimde kullan\u0131labilir mi?<\/h4>\n<p>Genellikle hay\u0131r. Bir g\u00fcnde olu\u015fturulan API'ler genellikle prototipleme, \u00f6\u011frenme veya \u00e7ok basit i\u00e7 ara\u00e7lar i\u00e7in uygundur. \u00dcretim ortam\u0131nda kullan\u0131lacak bir API, kapsaml\u0131 testlerden, g\u00fcvenlik denetimlerinden, performans optimizasyonlar\u0131ndan ve hata y\u00f6netiminden ge\u00e7melidir. Kullan\u0131c\u0131 kimlik do\u011frulama, yetkilendirme, geli\u015fmi\u015f hata loglama ve izleme gibi \u00f6zellikler \u00fcretim API'leri i\u00e7in olmazsa olmazd\u0131r. Ancak, bu rehberdeki temel ad\u0131mlar, \u00fcretim kalitesinde bir API'nin temelini olu\u015fturmak i\u00e7in iyi bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<h4>2. Mobil uyumluluk i\u00e7in HTML koduna medya sorgular\u0131 eklemeli miyim?<\/h4>\n<p>Bir REST API, genellikle bir web taray\u0131c\u0131s\u0131 taraf\u0131ndan t\u00fcketilen bir HTML sayfas\u0131n\u0131 do\u011frudan d\u00f6nd\u00fcrmez. Bunun yerine, JSON veya XML gibi veri formatlar\u0131nda yan\u0131t verir. Mobil uyumluluk (responsive design) genellikle bu API'yi kullanan frontend (web veya mobil) uygulamalar\u0131n\u0131n sorumlulu\u011fundad\u0131r. Yani, HTML sayfalar\u0131 i\u00e7in kullan\u0131lan medya sorgular\u0131 do\u011frudan API'nizin i\u00e7inde yer almaz; API'den gelen verileri g\u00f6rselle\u015ftiren frontend kodunda bulunur. Bu nedenle, API'nizin kendisi \"mobil uyumlu HTML\" \u00fcretmez, ancak veriyi mobil uygulamalar taraf\u0131ndan kolayca t\u00fcketilebilir bir formatta sunar.<\/p>\n<h4>3. Flask yerine Node.js\/Express kullan\u0131rsam s\u00fcre\u00e7 nas\u0131l de\u011fi\u015fir?<\/h4>\n<p>Temel mant\u0131k (HTTP metodlar\u0131, JSON, endpointler) ayn\u0131 kal\u0131r. Ancak, dil ve \u00e7er\u00e7eveye \u00f6zg\u00fc s\u00f6zdizimi de\u011fi\u015fir. \u00d6rne\u011fin, Flask'ta <code>@app.route<\/code> dekorat\u00f6rleri kullan\u0131rken, Express'te <code>app.get('\/todos', ...)<\/code> veya <code>app.post('\/todos', ...)<\/code> gibi metodlar kullan\u0131rs\u0131n\u0131z. Veritaban\u0131 etkile\u015fimi i\u00e7in de Node.js'e \u00f6zg\u00fc k\u00fct\u00fcphaneler (\u00f6rne\u011fin, MongoDB i\u00e7in Mongoose, NeDB) kullan\u0131l\u0131r. Genel olarak, Node.js asenkron bir yap\u0131ya sahip oldu\u011fu i\u00e7in callback'ler veya <code>async\/await<\/code> kullan\u0131m\u0131 daha yayg\u0131nd\u0131r. Ancak bir g\u00fcnde bir API olu\u015fturma hedefi ve temel CRUD i\u015flemleri her iki \u00e7er\u00e7evede de olduk\u00e7a benzer bir h\u0131zda ger\u00e7ekle\u015ftirilebilir.<\/p>\n<h4>4. API'me kullan\u0131c\u0131 kimlik do\u011frulama ve yetkilendirme ekleyebilir miyim?<\/h4>\n<p>Evet, kesinlikle ekleyebilirsiniz ve ger\u00e7ek d\u00fcnya uygulamalar\u0131 i\u00e7in bu zorunludur. Bir g\u00fcnde bu kadar karma\u015f\u0131k bir konuyu tam olarak uygulamak zor olsa da, bir sonraki ad\u0131m olarak bunu \u00f6\u011frenmeniz \u015fiddetle tavsiye edilir. Genellikle, kullan\u0131c\u0131lar kimlik bilgileriyle giri\u015f yapar ve API, kullan\u0131c\u0131ya bir JWT (JSON Web Token) d\u00f6nd\u00fcr\u00fcr. Sonraki t\u00fcm isteklerde bu token ba\u015fl\u0131kta g\u00f6nderilir ve API, token'\u0131 do\u011frulayarak kullan\u0131c\u0131n\u0131n kimli\u011fini ve yetkilerini kontrol eder. Flask i\u00e7in Flask-JWT-Extended, Node.js i\u00e7in Passport.js gibi k\u00fct\u00fcphaneler bu s\u00fcre\u00e7leri kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1513,1],"tags":[],"class_list":{"0":"post-33630","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-dusunsel-ve-kisisel","7":"category-genel","8":"cs-entry","9":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API&#039;yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API&#039;yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-05T05:45:47+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-11-05T05:45:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\"},\"wordCount\":3392,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"D\u00fc\u015f\u00fcnsel ve Ki\u015fisel\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\",\"name\":\"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-05T05:45:47+00:00\",\"description\":\"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API'yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber","description":"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API'yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber","og_description":"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API'yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.","og_url":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-05T05:45:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber","datePublished":"2025-11-05T05:45:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/"},"wordCount":3392,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["D\u00fc\u015f\u00fcnsel ve Ki\u015fisel"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/","name":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-05T05:45:47+00:00","description":"Bir g\u00fcn i\u00e7inde \u00e7al\u0131\u015fan, basit ama etkili bir REST API geli\u015ftirmek hayal mi? Kesinlikle de\u011fil! Bu kapsaml\u0131 rehber, kariyerinizin hangi noktas\u0131nda olursan\u0131z olun, temel bir API'yi sadece birka\u00e7 saat i\u00e7inde nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m g\u00f6steriyor. H\u0131zl\u0131ca prototip olu\u015fturmak, yeni bir teknoloji \u00f6\u011frenmek veya sadece fikrinizi kan\u0131tlamak m\u0131 istiyorsunuz? \u0130\u015fte tam da bu noktada devreye giren, pratik ve uygulamal\u0131 bir yol haritas\u0131 sunuyoruz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/bir-gunde-basit-bir-rest-api-nasil-olusturulur-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bir G\u00fcnde Basit Bir REST API Nas\u0131l Olu\u015fturulur? Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33630"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33630\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}