{"id":44517,"date":"2026-09-04T21:10:49","date_gmt":"2026-09-04T18:10:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/"},"modified":"2026-09-04T21:11:20","modified_gmt":"2026-09-04T18:11:20","slug":"25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/","title":{"rendered":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi"},"content":{"rendered":"<h2>25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi<\/h2>\n<p>G\u00fcn\u00fcm\u00fczde a\u00e7\u0131k veriye eri\u015fim, bir\u00e7ok geli\u015ftirici ve ara\u015ft\u0131rmac\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131maktad\u0131r. Ancak kamu kurumlar\u0131n\u0131n sa\u011flad\u0131\u011f\u0131 veriler genellikle da\u011f\u0131n\u0131k, farkl\u0131 formatlarda ve \u00e7o\u011fu zaman bir API (Uygulama Programlama Aray\u00fcz\u00fc) arac\u0131l\u0131\u011f\u0131yla eri\u015fim i\u00e7in karma\u015f\u0131k kay\u0131t s\u00fcre\u00e7leri gerektirebilir. Bu durum, veri entegrasyonunu yava\u015flat\u0131r ve inovasyonun \u00f6n\u00fcnde bir engel te\u015fkil eder. Peki, 25 farkl\u0131, g\u00fcnl\u00fck olarak g\u00fcncellenen kamu verisi sitesinden gelen verileri tek bir noktada toplayan, tamamen kay\u0131ts\u0131z ve kolayca eri\u015filebilir bir REST API olu\u015fturmak m\u00fcmk\u00fcn m\u00fcd\u00fcr? Bu rehber, bu sorunun cevab\u0131n\u0131 ad\u0131m ad\u0131m vererek, veri eri\u015fimini demokratikle\u015ftiren ve geli\u015ftiricilerin i\u015fini kolayla\u015ft\u0131ran bir \u00e7\u00f6z\u00fcm sunmay\u0131 hedefliyor.<\/p>\n<h2>Neden Kay\u0131ts\u0131z Bir REST API&#8217;ye \u0130htiya\u00e7 Duyar\u0131z?<\/h2>\n<p>Veriye eri\u015fimin \u00f6n\u00fcndeki en b\u00fcy\u00fck engellerden biri genellikle kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) s\u00fcre\u00e7leridir. Bir\u00e7ok API, kullan\u0131c\u0131lardan kay\u0131t olmalar\u0131n\u0131, API anahtar\u0131 (API key) almalar\u0131n\u0131 veya OAuth gibi karma\u015f\u0131k protokoller \u00fczerinden yetkilendirme yapmalar\u0131n\u0131 ister. Bu ad\u0131mlar, \u00f6zellikle kamusal ve zaten herkese a\u00e7\u0131k olmas\u0131 gereken veriler s\u00f6z konusu oldu\u011funda, gereksiz bir y\u00fck olu\u015fturabilir. Bir geli\u015ftiricinin hava durumu, d\u00f6viz kurlar\u0131, toplu ta\u015f\u0131ma saatleri veya \u015fehir etkinlikleri gibi verilere h\u0131zl\u0131ca eri\u015fmesi gerekti\u011finde, her veri kayna\u011f\u0131 i\u00e7in ayr\u0131 ayr\u0131 kay\u0131t s\u00fcre\u00e7lerinden ge\u00e7mek zaman kayb\u0131na yol a\u00e7ar ve projenin ba\u015flang\u0131\u00e7 maliyetini art\u0131r\u0131r.<\/p>\n<p>Kay\u0131ts\u0131z bir REST API, bu sorunlar\u0131 ortadan kald\u0131rarak veri eri\u015fimini radikal bir \u015fekilde basitle\u015ftirir. Geli\u015ftiriciler, herhangi bir \u00f6n kay\u0131t veya kimlik bilgisi sa\u011flamadan do\u011frudan API u\u00e7 noktalar\u0131na (endpoints) istek g\u00f6nderebilirler. Bu yakla\u015f\u0131m, \u00f6zellikle h\u0131zl\u0131 prototipleme, e\u011fitim ama\u00e7l\u0131 projeler veya geni\u015f kitlelere ula\u015fmas\u0131 hedeflenen kamu hizmetleri i\u00e7in idealdir. \u00d6rne\u011fin, bir belediye, \u015fehrin parklar\u0131ndaki doluluk oranlar\u0131n\u0131, anl\u0131k trafik yo\u011funlu\u011funu veya k\u00fclt\u00fcrel etkinlik takvimini bir API \u00fczerinden sunmak istedi\u011finde, vatanda\u015flar\u0131n veya \u00fc\u00e7\u00fcnc\u00fc taraf geli\u015ftiricilerin bu verilere zahmetsizce ula\u015fabilmesi b\u00fcy\u00fck bir avantaj sa\u011flar. Kay\u0131ts\u0131z bir API, veri kullan\u0131m\u0131n\u0131 te\u015fvik eder, yeni uygulamalar\u0131n ve hizmetlerin ortaya \u00e7\u0131kmas\u0131na zemin haz\u0131rlar ve en \u00f6nemlisi, a\u00e7\u0131k veri felsefesinin temel prensiplerinden biri olan &#8220;eri\u015filebilirli\u011fi&#8221; en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131r.<\/p>\n<p>Ayr\u0131ca, bu t\u00fcr bir API, veri silosunu (data silo) k\u0131rarak farkl\u0131 kamu kurumlar\u0131ndan gelen da\u011f\u0131n\u0131k verileri tek bir merkezi noktada birle\u015ftirme potansiyeli sunar. Bu, veri analistleri, ara\u015ft\u0131rmac\u0131lar ve gazeteciler i\u00e7in paha bi\u00e7ilmez bir kaynak olabilir. \u00d6rne\u011fin, 25 farkl\u0131 kaynaktan gelen veriler aras\u0131nda korelasyonlar bulmak veya genel e\u011filimleri izlemek, tek tek her siteyi ziyaret etmekten \u00e7ok daha verimli hale gelir. Kay\u0131ts\u0131zl\u0131k, bu t\u00fcr bir \u00e7apraz veri analizini ve entegrasyonunu h\u0131zland\u0131r\u0131r, b\u00f6ylece verinin ger\u00e7ek de\u011ferinin ortaya \u00e7\u0131kmas\u0131na yard\u0131mc\u0131 olur. Sonu\u00e7 olarak, kay\u0131ts\u0131z bir REST API, hem geli\u015ftiriciler hem de veri t\u00fcketicileri i\u00e7in veri eri\u015fimini kolayla\u015ft\u0131ran, h\u0131zland\u0131ran ve demokratikle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h2>Temel Kavramlar: API, REST ve Web Kaz\u0131ma (Scraping) Nedir?<\/h2>\n<p>Bu projenin temelini olu\u015fturan \u00fc\u00e7 ana kavram\u0131 anlamak, ba\u015far\u0131l\u0131 bir uygulama geli\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir. Bunlar: API (Uygulama Programlama Aray\u00fcz\u00fc), REST (Representational State Transfer) ve Web Kaz\u0131ma (Web Scraping).<\/p>\n<h3>API (Uygulama Programlama Aray\u00fcz\u00fc)<\/h3>\n<p>API, en basit tan\u0131m\u0131yla, iki yaz\u0131l\u0131m bile\u015feninin birbiriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan bir dizi kural ve mekanizmad\u0131r. Bir restoran men\u00fcs\u00fc gibi d\u00fc\u015f\u00fcnebilirsiniz; men\u00fc, mutfaktan (veri kayna\u011f\u0131) ne t\u00fcr yemekler (veri) isteyebilece\u011finizi ve bu yemeklerin nas\u0131l haz\u0131rlanaca\u011f\u0131n\u0131 (veri format\u0131) size s\u00f6yler. Siz sipari\u015f verdi\u011finizde, mutfak iste\u011finizi i\u015fler ve yeme\u011fi size sunar. Bir API de benzer \u015fekilde, bir uygulaman\u0131n ba\u015fka bir uygulamadan belirli bir hizmet veya veri istemesine olanak tan\u0131r. \u00d6rne\u011fin, bir hava durumu uygulamas\u0131, bir hava durumu servisinin API&#8217;sini kullanarak anl\u0131k s\u0131cakl\u0131k verilerini \u00e7ekebilir.<\/p>\n<h3>REST (Representational State Transfer)<\/h3>\n<p>REST, web servisleri geli\u015ftirmek i\u00e7in kullan\u0131lan bir mimari stildir. Bir web servisinin RESTful olabilmesi i\u00e7in belirli prensiplere uymas\u0131 gerekir. Bu prensipler \u015funlar\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><strong>Durumsuzluk (Statelessness):<\/strong> Her istek, sunucunun iste\u011fi anlamak i\u00e7in ihtiya\u00e7 duydu\u011fu t\u00fcm bilgiyi i\u00e7ermelidir. Sunucu, \u00f6nceki isteklerden herhangi bir istemci durumunu saklamaz. Bu, API&#8217;nin daha \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>\u0130stemci-Sunucu Ayr\u0131m\u0131 (Client-Server Separation):<\/strong> \u0130stemci ve sunucu birbirinden ba\u011f\u0131ms\u0131zd\u0131r. \u0130stemci kullan\u0131c\u0131 aray\u00fcz\u00fc ve kullan\u0131c\u0131 deneyiminden, sunucu ise veri depolama ve i\u015f mant\u0131\u011f\u0131ndan sorumludur.<\/li>\n<li><strong>\u00d6nbelleklenebilirlik (Cacheability):<\/strong> Yan\u0131tlar, \u00f6nbelle\u011fe al\u0131nabilir olarak i\u015faretlenebilir. Bu, performans\u0131 art\u0131r\u0131r ve sunucu y\u00fck\u00fcn\u00fc azalt\u0131r.<\/li>\n<li><strong>Katmanl\u0131 Sistem (Layered System):<\/strong> Bir istemci, do\u011frudan bir sunucuya ba\u011fl\u0131 olup olmad\u0131\u011f\u0131n\u0131 veya bir ara katman (\u00f6rne\u011fin, proxy, y\u00fck dengeleyici) \u00fczerinden ileti\u015fim kurup kurmad\u0131\u011f\u0131n\u0131 bilmez.<\/li>\n<li><strong>Tekd\u00fcze Aray\u00fcz (Uniform Interface):<\/strong> Bu, REST&#8217;in en \u00f6nemli k\u0131s\u0131mlar\u0131ndan biridir ve d\u00f6rt temel prensibi i\u00e7erir:\n<ul>\n<li><strong>Kaynaklar\u0131n Tan\u0131mlanmas\u0131 (Identification of Resources):<\/strong> Her kayna\u011f\u0131n (\u00f6rne\u011fin, bir hava durumu tahmini, bir d\u00f6viz kuru) benzersiz bir URL (Uniform Resource Locator) ile tan\u0131mlanmas\u0131.<\/li>\n<li><strong>Kaynaklar\u0131n Temsilleri Arac\u0131l\u0131\u011f\u0131yla \u0130\u015flenmesi (Manipulation of Resources Through Representations):<\/strong> \u0130stemci, bir kayna\u011f\u0131n temsilini (\u00f6rne\u011fin, JSON veya XML format\u0131nda) alarak veya g\u00f6ndererek kayna\u011f\u0131 de\u011fi\u015ftirebilir.<\/li>\n<li><strong>Kendi Kendini A\u00e7\u0131klayan Mesajlar (Self-Descriptive Messages):<\/strong> Her mesaj, iste\u011fi nas\u0131l i\u015fleyece\u011fini anlamak i\u00e7in yeterli bilgiye sahip olmal\u0131d\u0131r.<\/li>\n<li><strong>Uygulama Durumunun Motoru Olarak Hipermedya (Hypermedia as the Engine of Application State &#8211; HATEOAS):<\/strong> Bir kaynak temsilinde, ilgili di\u011fer kaynaklara ba\u011flant\u0131lar (linkler) bulunmal\u0131d\u0131r. Bu, istemcinin API&#8217;yi ke\u015ffetmesini sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bizim durumumuzda, API&#8217;miz genellikle sadece <code class=\"language-html\">GET<\/code> isteklerini kullanarak veri sa\u011flayacak ve <code class=\"language-html\">JSON<\/code> format\u0131nda yan\u0131tlar d\u00f6necektir.<\/p>\n<h3>Web Kaz\u0131ma (Web Scraping)<\/h3>\n<p>Web kaz\u0131ma, web sitelerinden otomatik olarak veri toplama i\u015flemidir. Genellikle, bir web sitesinin HTML i\u00e7eri\u011fi indirilir, ard\u0131ndan belirli desenler veya etiketler kullan\u0131larak istenen veriler ay\u0131klan\u0131r. Bu s\u00fcre\u00e7, manuel olarak veri kopyalay\u0131p yap\u0131\u015ft\u0131rmaktan \u00e7ok daha h\u0131zl\u0131 ve verimlidir. Ancak web kaz\u0131ma yaparken dikkat edilmesi gereken \u00f6nemli noktalar vard\u0131r:<\/p>\n<ul>\n<li><strong>Yasal ve Etik Boyutlar:<\/strong> Kaz\u0131mak istedi\u011finiz sitenin <code class=\"language-html\">robots.txt<\/code> dosyas\u0131n\u0131 kontrol etmek ve kullan\u0131m ko\u015fullar\u0131n\u0131 okumak \u00f6nemlidir. Baz\u0131 siteler kaz\u0131may\u0131 a\u00e7\u0131k\u00e7a yasaklar. Kamu verileri genellikle daha serbesttir ancak yine de dikkatli olmak gerekir.<\/li>\n<li><strong>Site Y\u00fck\u00fc:<\/strong> Sitelere a\u015f\u0131r\u0131 istek g\u00f6ndererek sunucular\u0131na y\u00fck bindirmemek \u00f6nemlidir. \u0130stekler aras\u0131nda gecikmeler (delays) eklemek ve makul bir h\u0131zda \u00e7al\u0131\u015fmak etik bir yakla\u015f\u0131md\u0131r.<\/li>\n<li><strong>Site Yap\u0131s\u0131 De\u011fi\u015fiklikleri:<\/strong> Web sitelerinin HTML yap\u0131s\u0131 zamanla de\u011fi\u015febilir. Bu, kaz\u0131ma kodunuzun bozulmas\u0131na ve g\u00fcncelleme gerektirmesine neden olabilir.<\/li>\n<\/ul>\n<p>Pop\u00fcler web kaz\u0131ma ara\u00e7lar\u0131 aras\u0131nda Python i\u00e7in <code class=\"language-html\">BeautifulSoup<\/code> ve <code class=\"language-html\">Scrapy<\/code> k\u00fct\u00fcphaneleri bulunmaktad\u0131r. Bizim projemizde, bu ara\u00e7lar\u0131 kullanarak 25 farkl\u0131 kamu veri sitesinden g\u00fcncel verileri toplayacak ve API&#8217;miz \u00fczerinden sunaca\u011f\u0131z.<\/p>\n<p>Bu \u00fc\u00e7 temel kavram\u0131 bir araya getirdi\u011fimizde, hedefimiz netle\u015fiyor: Web kaz\u0131ma teknikleriyle 25 kamu veri sitesinden verileri toplamak, bu verileri <code class=\"language-html\">JSON<\/code> gibi standart bir formatta d\u00fczenlemek ve ard\u0131ndan bu verilere <code class=\"language-html\">RESTful<\/code> prensiplerine uygun, kay\u0131ts\u0131z bir API arac\u0131l\u0131\u011f\u0131yla eri\u015fim sa\u011flamak. Bu, veri eri\u015fimini kolayla\u015ft\u0131racak ve geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc bir kaynak yaratacakt\u0131r.<\/p>\n<h2>Veri Kaynaklar\u0131n\u0131 Belirleme ve Toplama Stratejileri<\/h2>\n<p>25 g\u00fcnl\u00fck g\u00fcncellenen kamu veri sitesinden veri toplamak, projenin en temel ve s\u00fcrekli dikkat gerektiren ad\u0131mlar\u0131ndan biridir. Do\u011fru veri kaynaklar\u0131n\u0131 se\u00e7mek, toplama y\u00f6ntemlerini belirlemek ve verileri d\u00fczenlemek, API&#8217;mizin kalitesini do\u011frudan etkileyecektir.<\/p>\n<h3>Veri Kaynaklar\u0131n\u0131 Se\u00e7erken Kriterler<\/h3>\n<p>25 siteyi belirlerken a\u015fa\u011f\u0131daki kriterleri g\u00f6z \u00f6n\u00fcnde bulundurmak faydal\u0131 olacakt\u0131r:<\/p>\n<ul>\n<li><strong>G\u00fcncellik:<\/strong> Verilerin ger\u00e7ekten g\u00fcnl\u00fck olarak g\u00fcncellendi\u011finden emin olun. Bu, API&#8217;mizin temel vaatlerinden biridir.<\/li>\n<li><strong>Eri\u015filebilirlik:<\/strong> Sitelerin <code class=\"language-html\">robots.txt<\/code> dosyalar\u0131n\u0131 kontrol edin ve kaz\u0131ma yapmaya izin verip vermediklerini teyit edin. \u00c7o\u011fu kamu sitesi a\u00e7\u0131k veri prensipleri gere\u011fi kaz\u0131maya izin verir ancak yine de kontrol \u00f6nemlidir.<\/li>\n<li><strong>Veri Yap\u0131s\u0131:<\/strong> Verilerin HTML i\u00e7inde ne kadar d\u00fczenli oldu\u011fu, kaz\u0131ma i\u015flemini kolayla\u015ft\u0131r\u0131r veya zorla\u015ft\u0131r\u0131r. Tablolar, belirli <code class=\"language-html\">id<\/code> veya <code class=\"language-html\">class<\/code> etiketleri ile i\u015faretlenmi\u015f alanlar kaz\u0131ma i\u00e7in idealdir.<\/li>\n<li><strong>Veri \u00c7e\u015fitlili\u011fi:<\/strong> Farkl\u0131 t\u00fcrde veriler (ekonomik, meteorolojik, k\u00fclt\u00fcrel, ula\u015f\u0131m vb.) sunan siteler se\u00e7mek, API&#8217;mizi daha zengin hale getirecektir. \u00d6rne\u011fin, T\u00fcrkiye \u0130statistik Kurumu (T\u00dc\u0130K) gibi kurumlar, bir\u00e7ok farkl\u0131 kategoride veri sunar. Belediyelerin a\u00e7\u0131k veri portallar\u0131 da yerel bazda zengin veri kaynaklar\u0131d\u0131r.<\/li>\n<li><strong>G\u00fcvenilirlik:<\/strong> Veri kayna\u011f\u0131n\u0131n resmi ve g\u00fcvenilir bir kurum taraf\u0131ndan sa\u011fland\u0131\u011f\u0131ndan emin olun.<\/li>\n<\/ul>\n<p>\u00d6rnek veri kaynaklar\u0131 \u015funlar olabilir:<\/p>\n<ul>\n<li>Meteoroloji Genel M\u00fcd\u00fcrl\u00fc\u011f\u00fc (hava durumu)<\/li>\n<li>Merkez Bankas\u0131 (d\u00f6viz kurlar\u0131, faiz oranlar\u0131)<\/li>\n<li>T.C. Ula\u015ft\u0131rma ve Altyap\u0131 Bakanl\u0131\u011f\u0131 (trafik yo\u011funlu\u011fu, yol durumu)<\/li>\n<li>B\u00fcy\u00fck\u015fehir Belediyeleri (toplu ta\u015f\u0131ma saatleri, \u015fehir etkinlikleri, park doluluklar\u0131)<\/li>\n<li>Sa\u011fl\u0131k Bakanl\u0131\u011f\u0131 (belirli sa\u011fl\u0131k istatistikleri, a\u015f\u0131 verileri)<\/li>\n<li>K\u00fclt\u00fcr ve Turizm Bakanl\u0131\u011f\u0131 (m\u00fcze ziyaret\u00e7i say\u0131lar\u0131, etkinlik takvimleri)<\/li>\n<li>Enerji Piyasas\u0131 D\u00fczenleme Kurumu (EPDK) (akaryak\u0131t fiyatlar\u0131)<\/li>\n<\/ul>\n<h3>Otomatik Veri Toplama Y\u00f6ntemleri ve Zamanlama<\/h3>\n<p>Verilerin g\u00fcnl\u00fck olarak g\u00fcncellenmesi gerekti\u011fi i\u00e7in, veri toplama s\u00fcrecini otomatikle\u015ftirmek zorunludur. Bu genellikle zamanlanm\u0131\u015f g\u00f6revler (scheduled tasks) veya <code class=\"language-html\">cron<\/code> i\u015fleri arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r.<\/p>\n<p>Her bir veri kayna\u011f\u0131 i\u00e7in ayr\u0131 bir kaz\u0131ma beti\u011fi (script) yazmak ve bu betikleri belirli aral\u0131klarla \u00e7al\u0131\u015ft\u0131rmak en yayg\u0131n y\u00f6ntemdir. \u00d6rne\u011fin, Python&#8217;da <code class=\"language-html\">requests<\/code> k\u00fct\u00fcphanesi ile web sayfas\u0131n\u0131n i\u00e7eri\u011fini \u00e7ekip, <code class=\"language-html\">BeautifulSoup<\/code> ile istedi\u011fimiz verileri ay\u0131klayabiliriz. Bu betikler, verileri i\u015fledikten sonra bir veritaban\u0131na (\u00f6rne\u011fin, PostgreSQL, MongoDB) veya basit bir <code class=\"language-html\">JSON<\/code> dosyas\u0131na kaydedebilir.<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport requests\nfrom bs4 import BeautifulSoup\nimport json\nfrom datetime import datetime\n\ndef kazima_ornegi_hava_durumu(url):\n    try:\n        response = requests.get(url, timeout=10)\n        response.raise_for_status() # HTTP hatalar\u0131 i\u00e7in\n        soup = BeautifulSoup(response.text, 'html.parser')\n\n        # \u00d6rnek: Hava durumu verilerini belirli bir HTML yap\u0131s\u0131ndan \u00e7ekme\n        # Bu k\u0131s\u0131m her siteye g\u00f6re \u00f6zelle\u015ftirilmelidir.\n        # \u00d6rne\u011fin, bir div i\u00e7indeki s\u0131cakl\u0131k de\u011feri:\n        sicaklik_elementi = soup.find('span', class_='current-temp')\n        sicaklik = sicaklik_elementi.text.strip() if sicaklik_elementi else 'N\/A'\n\n        sehir_elementi = soup.find('h1', class_='city-name')\n        sehir = sehir_elementi.text.strip() if sehir_elementi else 'N\/A'\n\n        veri = {\n            \"kaynak\": url,\n            \"sehir\": sehir,\n            \"sicaklik\": sicaklik,\n            \"guncelleme_tarihi\": datetime.now().isoformat()\n        }\n        return veri\n    except requests.exceptions.RequestException as e:\n        print(f\"Hava durumu kaz\u0131ma hatas\u0131: {e}\")\n        return None\n\n# \u00d6rnek kullan\u0131m\n# hava_durumu_url = \"https:\/\/www.mgm.gov.tr\/...\" # Ger\u00e7ek bir URL ile de\u011fi\u015ftirin\n# hava_durumu_verisi = kazima_ornegi_hava_durumu(hava_durumu_url)\n# if hava_durumu_verisi:\n#    print(json.dumps(hava_durumu_verisi, indent=2, ensure_ascii=False))\n\n# Veritaban\u0131na kaydetme veya JSON dosyas\u0131na yazma mant\u0131\u011f\u0131 buraya eklenebilir.\n  <\/code><\/pre>\n<\/div>\n<p>Bu betikler, g\u00fcnl\u00fck olarak belirli bir saatte (\u00f6rne\u011fin, gece yar\u0131s\u0131ndan sonra) \u00e7al\u0131\u015ft\u0131r\u0131lacak \u015fekilde ayarlanmal\u0131d\u0131r. Linux sistemlerinde <code class=\"language-html\">cron<\/code>, Windows&#8217;ta G\u00f6rev Zamanlay\u0131c\u0131 (Task Scheduler) veya bulut platformlar\u0131nda (AWS Lambda, Google Cloud Functions) sunucusuz (serverless) fonksiyonlar bu otomasyonu sa\u011flayabilir. Her beti\u011fin kendi hata y\u00f6netimi ve g\u00fcnl\u00fck kayd\u0131 (logging) mekanizmas\u0131na sahip olmas\u0131, sorunlar\u0131 tespit etmede kritik \u00f6neme sahiptir.<\/p>\n<h3>Veri Temizleme ve Standardizasyon<\/h3>\n<p>Farkl\u0131 kaynaklardan gelen veriler genellikle farkl\u0131 formatlarda, birimlerde veya adland\u0131rmalarda olabilir. API&#8217;mizin tutarl\u0131 ve kullan\u0131\u015fl\u0131 olmas\u0131 i\u00e7in bu verilerin temizlenmesi ve standartla\u015ft\u0131r\u0131lmas\u0131 \u015fartt\u0131r. \u00d6rne\u011fin:<\/p>\n<ul>\n<li>Say\u0131sal de\u011ferlerdeki virg\u00fcl\/nokta farkl\u0131l\u0131klar\u0131.<\/li>\n<li>Tarih ve saat formatlar\u0131n\u0131n tek tiple\u015ftirilmesi (\u00f6rne\u011fin, ISO 8601 format\u0131).<\/li>\n<li>Metin alanlar\u0131ndaki gereksiz bo\u015fluklar\u0131n veya \u00f6zel karakterlerin temizlenmesi.<\/li>\n<li>Farkl\u0131 kaynaklarda ayn\u0131 anlama gelen terimlerin tek bir terimle ifade edilmesi (\u00f6rne\u011fin, &#8220;\u0130stanbul Hava Durumu&#8221; ve &#8220;\u0130st. H.D.&#8221; yerine &#8220;\u0130stanbul&#8221;).<\/li>\n<li>Eksik verilerin (missing data) nas\u0131l ele al\u0131naca\u011f\u0131 (bo\u015f b\u0131rakmak, varsay\u0131lan bir de\u011fer atamak veya d\u0131\u015flamak).<\/li>\n<\/ul>\n<p>Bu ad\u0131mlar, API kullan\u0131c\u0131lar\u0131n\u0131n veriyi daha kolay anlamas\u0131n\u0131 ve kendi uygulamalar\u0131na entegre etmesini sa\u011flar. Veri temizleme ve standardizasyon a\u015famalar\u0131, kaz\u0131ma betiklerinin bir par\u00e7as\u0131 olarak veya veriler veritaban\u0131na kaydedilmeden hemen \u00f6nce ger\u00e7ekle\u015ftirilmelidir.<\/p>\n<p>Bu stratejilerle, API&#8217;miz i\u00e7in sa\u011flam, g\u00fcncel ve tutarl\u0131 bir veri taban\u0131 olu\u015fturabiliriz. Bu, projemizin ba\u015far\u0131s\u0131 i\u00e7in hayati bir temeldir.<\/p>\n<h2>REST API Tasar\u0131m\u0131 ve Geli\u015ftirme Ad\u0131mlar\u0131<\/h2>\n<p>Veri toplama stratejilerimizi belirledikten sonra, s\u0131ra bu verilere kolayca eri\u015fim sa\u011flayacak REST API&#8217;mizi tasarlamaya ve geli\u015ftirmeye geliyor. Kay\u0131ts\u0131z (no-signup) bir API olu\u015fturman\u0131n anahtar\u0131, basitlik ve tutarl\u0131l\u0131k \u00fczerine odaklanmakt\u0131r.<\/p>\n<h3>Endpoint (U\u00e7 Nokta) Yap\u0131lar\u0131<\/h3>\n<p>API&#8217;mizin temelini, kaynaklara eri\u015fim sa\u011flayan u\u00e7 noktalar olu\u015fturur. Her bir veri t\u00fcr\u00fc veya kayna\u011f\u0131 i\u00e7in anlaml\u0131 ve tahmin edilebilir URL yap\u0131lar\u0131 tasarlamak \u00f6nemlidir. Versiyonlama (versioning) da gelecekteki de\u011fi\u015fiklikler i\u00e7in iyi bir uygulamad\u0131r.<\/p>\n<ul>\n<li><code>\/api\/v1\/hava_durumu\/{sehir}<\/code>: Belirli bir \u015fehir i\u00e7in hava durumu verileri.<\/li>\n<li><code>\/api\/v1\/doviz_kurlari<\/code>: G\u00fcncel d\u00f6viz kurlar\u0131.<\/li>\n<li><code>\/api\/v1\/ulasim\/otobus\/{hat_no}<\/code>: Belirli bir otob\u00fcs hatt\u0131n\u0131n g\u00fcncel bilgileri.<\/li>\n<li><code>\/api\/v1\/etkinlikler<\/code>: \u015eehirdeki g\u00fcncel etkinlikler.<\/li>\n<li><code>\/api\/v1\/tum_veriler<\/code>: T\u00fcm kaynaklardan toplanan \u00f6zet veriler (b\u00fcy\u00fck bir yan\u0131t olabilece\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131).<\/li>\n<\/ul>\n<p>U\u00e7 noktalar\u0131n anla\u015f\u0131l\u0131r ve hiyerar\u015fik olmas\u0131, API&#8217;nin ke\u015ffedilebilirli\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, bir \u015fehirdeki t\u00fcm etkinlikleri listelemek i\u00e7in <code>\/api\/v1\/sehirler\/{sehir}\/etkinlikler<\/code> gibi bir yap\u0131 da d\u00fc\u015f\u00fcn\u00fclebilir.<\/p>\n<h3>HTTP Metotlar\u0131: Sadece GET (Okuma)<\/h3>\n<p>Kay\u0131ts\u0131z ve sadece kamu verilerini sunan bir API oldu\u011fu i\u00e7in, genellikle sadece <code class=\"language-html\">GET<\/code> (okuma) metodu yeterli olacakt\u0131r. Bu, API&#8217;nin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r ve g\u00fcvenlik risklerini minimize eder. Kullan\u0131c\u0131lar\u0131n veri olu\u015fturmas\u0131na (<code class=\"language-html\">POST<\/code>), g\u00fcncellemesine (<code class=\"language-html\">PUT<\/code>\/<code class=\"language-html\">PATCH<\/code>) veya silmesine (<code class=\"language-html\">DELETE<\/code>) gerek yoktur, \u00e7\u00fcnk\u00fc veriler bizim kaz\u0131ma betiklerimiz taraf\u0131ndan g\u00fcncellenmektedir.<\/p>\n<h3>Kimlik Do\u011frulamas\u0131z (No-signup) Yakla\u015f\u0131m<\/h3>\n<p>Bu, projemizin en kritik \u00f6zelli\u011fidir. Herhangi bir API anahtar\u0131, token veya kullan\u0131c\u0131 ad\u0131\/\u015fifre gerektirmeyen bir eri\u015fim modeli benimsiyoruz. Bununla birlikte, k\u00f6t\u00fcye kullan\u0131m\u0131 \u00f6nlemek ve sunucuyu a\u015f\u0131r\u0131 y\u00fcklenmeden korumak i\u00e7in baz\u0131 \u00f6nlemler almak gerekebilir:<\/p>\n<ul>\n<li><strong>\u0130stek S\u0131n\u0131rlama (Rate Limiting):<\/strong> Bir IP adresinden belirli bir zaman diliminde yap\u0131labilecek istek say\u0131s\u0131n\u0131 s\u0131n\u0131rlamak. Bu, sunucunun DDoS (Distributed Denial of Service) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 korunmas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li><strong>\u00d6nbellekleme (Caching):<\/strong> S\u0131k\u00e7a istenen verileri \u00f6nbellekte tutarak sunucuya olan y\u00fck\u00fc azaltmak ve yan\u0131t s\u00fcrelerini h\u0131zland\u0131rmak.<\/li>\n<\/ul>\n<h3>Teknoloji Se\u00e7imi<\/h3>\n<p>API geli\u015ftirmek i\u00e7in bir\u00e7ok se\u00e7enek mevcuttur. Python ekosistemi, web kaz\u0131ma ve API geli\u015ftirme i\u00e7in olduk\u00e7a pop\u00fcler ve g\u00fc\u00e7l\u00fc ara\u00e7lar sunar:<\/p>\n<ul>\n<li><strong>Flask:<\/strong> Mikro bir web framework (yaz\u0131l\u0131m \u00e7er\u00e7evesi) olup, h\u0131zl\u0131ca API olu\u015fturmak i\u00e7in idealdir. Hafif yap\u0131s\u0131 sayesinde performans\u0131 y\u00fcksektir.<\/li>\n<li><strong>FastAPI:<\/strong> Modern, h\u0131zl\u0131 (Starlette ve Pydantic \u00fczerine kurulu) ve asenkron (async\/await) deste\u011fi olan bir framework. Otomatik API dok\u00fcmantasyonu (Swagger UI) ile birlikte gelir.<\/li>\n<li><strong>Django REST Framework:<\/strong> Daha b\u00fcy\u00fck ve karma\u015f\u0131k projeler i\u00e7in Django&#8217;nun \u00fczerine in\u015fa edilmi\u015f g\u00fc\u00e7l\u00fc bir REST framework&#8217;\u00fcd\u00fcr.<\/li>\n<\/ul>\n<p>Bu rehberde, basitli\u011fi ve h\u0131zl\u0131 geli\u015ftirme imkanlar\u0131 nedeniyle Flask veya FastAPI&#8217;yi tercih edebiliriz. Verileri depolamak i\u00e7in ise basit <code class=\"language-html\">JSON<\/code> dosyalar\u0131 veya hafif bir veritaban\u0131 (SQLite, MongoDB) kullan\u0131labilir. G\u00fcnl\u00fck g\u00fcncellenen 25 site i\u00e7in, verileri <code class=\"language-html\">JSON<\/code> format\u0131nda diskte tutmak veya bir NoSQL veritaban\u0131nda (\u00f6rne\u011fin MongoDB) saklamak pratik olabilir.<\/p>\n<h3>Kod \u00d6rne\u011fi: Basit Bir Flask API&#8217;si ve Veri Kaz\u0131ma Entegrasyonu<\/h3>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, Flask kullanarak nas\u0131l basit bir API olu\u015fturulaca\u011f\u0131n\u0131 ve kaz\u0131nan verileri nas\u0131l sunaca\u011f\u0131n\u0131 g\u00f6sterir. Ger\u00e7ek uygulamada, <code class=\"language-html\">get_hava_durumu_data()<\/code> fonksiyonu, kaz\u0131ma betiklerimizden gelen g\u00fcncel verileri bir veritaban\u0131ndan veya <code class=\"language-html\">JSON<\/code> dosyas\u0131ndan okuyacakt\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom flask import Flask, jsonify\nimport json\nfrom datetime import datetime\n\napp = Flask(__name__)\n\n# \u00d6rnek veri depolamas\u0131 (Ger\u00e7ekte veritaban\u0131 veya daha geli\u015fmi\u015f bir yap\u0131 kullan\u0131lmal\u0131)\n# Bu, kaz\u0131ma betikleriniz taraf\u0131ndan g\u00fcncellenecek olan veridir.\ndata_store = {\n    \"hava_durumu\": [\n        {\"sehir\": \"Ankara\", \"sicaklik\": \"15\u00b0C\", \"durum\": \"Par\u00e7al\u0131 Bulutlu\", \"guncelleme\": \"2023-10-27T10:00:00\"},\n        {\"sehir\": \"\u0130stanbul\", \"sicaklik\": \"18\u00b0C\", \"durum\": \"G\u00fcne\u015fli\", \"guncelleme\": \"2023-10-27T10:00:00\"}\n    ],\n    \"doviz_kurlari\": {\n        \"USD\": {\"alis\": \"28.00\", \"satis\": \"28.10\", \"guncelleme\": \"2023-10-27T10:05:00\"},\n        \"EUR\": {\"alis\": \"29.50\", \"satis\": \"29.65\", \"guncelleme\": \"2023-10-27T10:05:00\"}\n    }\n}\n\n# Kaz\u0131ma betiklerinin g\u00fcncel veriyi buraya kaydetti\u011fini varsayal\u0131m\ndef load_data_from_disk():\n    global data_store\n    try:\n        with open('data.json', 'r', encoding='utf-8') as f:\n            data_store = json.load(f)\n    except FileNotFoundError:\n        print(\"data.json bulunamad\u0131, ba\u015flang\u0131\u00e7 verileri kullan\u0131l\u0131yor.\")\n    except json.JSONDecodeError:\n        print(\"data.json bozuk, ba\u015flang\u0131\u00e7 verileri kullan\u0131l\u0131yor.\")\n\n# API u\u00e7 noktalar\u0131\n@app.route('\/api\/v1\/hava_durumu', methods=['GET'])\ndef get_hava_durumu():\n    load_data_from_disk() # Her istekte g\u00fcncel veriyi y\u00fckle (performans i\u00e7in \u00f6nbellekleme \u00f6nerilir)\n    return jsonify(data_store.get(\"hava_durumu\", []))\n\n@app.route('\/api\/v1\/hava_durumu\/<string:sehir>', methods=['GET'])\ndef get_hava_durumu_by_sehir(sehir):\n    load_data_from_disk()\n    for item in data_store.get(\"hava_durumu\", []):\n        if item[\"sehir\"].lower() == sehir.lower():\n            return jsonify(item)\n    return jsonify({\"hata\": \"\u015eehir bulunamad\u0131\"}), 404\n\n@app.route('\/api\/v1\/doviz_kurlari', methods=['GET'])\ndef get_doviz_kurlari():\n    load_data_from_disk()\n    return jsonify(data_store.get(\"doviz_kurlari\", {}))\n\n@app.route('\/')\ndef index():\n    return \"Ho\u015f Geldiniz! API d\u00f6k\u00fcmantasyonu i\u00e7in \/docs adresini ziyaret edebilirsiniz (e\u011fer FastAPI kullan\u0131lsayd\u0131).\"\n\nif __name__ == '__main__':\n    # Bu k\u0131sm\u0131 sadece geli\u015ftirme ortam\u0131nda kullan\u0131n.\n    # \u00dcretim i\u00e7in Gunicorn veya uWSGI gibi bir WSGI sunucusu kullan\u0131n.\n    app.run(debug=True, port=5000)\n  <\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011fu, Flask ile nas\u0131l temel bir API olu\u015fturulaca\u011f\u0131n\u0131 g\u00f6steriyor. <code class=\"language-html\">load_data_from_disk()<\/code> fonksiyonu, kaz\u0131ma betikleriniz taraf\u0131ndan olu\u015fturulan <code class=\"language-html\">data.json<\/code> dosyas\u0131n\u0131 okuyarak verileri API&#8217;ye sunar. Ger\u00e7ek bir senaryoda, bu veriler bir veritaban\u0131ndan \u00e7ekilmeli ve performans i\u00e7in \u00f6nbelle\u011fe al\u0131nmal\u0131d\u0131r. Bu basit yap\u0131, 25 farkl\u0131 veri kayna\u011f\u0131n\u0131n verilerini tek bir API \u00fczerinden sunmak i\u00e7in geni\u015fletilebilir.<\/p>\n<h2>API Da\u011f\u0131t\u0131m\u0131 (Deployment), \u00d6l\u00e7eklenebilirlik ve Bak\u0131m<\/h2>\n<p>API&#8217;mizi geli\u015ftirdikten sonra, onu d\u00fcnya ile payla\u015fmak i\u00e7in da\u011f\u0131tmak (deploy etmek) ve s\u00fcrekli olarak g\u00fcncel, eri\u015filebilir ve performansl\u0131 kalmas\u0131n\u0131 sa\u011flamak kritik \u00f6neme sahiptir. Bu, sunucu se\u00e7imi, kapsay\u0131c\u0131la\u015ft\u0131rma (containerization), \u00f6l\u00e7eklenebilirlik ve s\u00fcrekli bak\u0131m s\u00fcre\u00e7lerini i\u00e7erir.<\/p>\n<h3>Sunucu Se\u00e7imi ve Da\u011f\u0131t\u0131m Ortamlar\u0131<\/h3>\n<p>API&#8217;mizi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in birka\u00e7 farkl\u0131 sunucu ve da\u011f\u0131t\u0131m ortam\u0131 se\u00e7ene\u011fi mevcuttur:<\/p>\n<ul>\n<li><strong>Bulut Platformlar\u0131 (Cloud Platforms):<\/strong> AWS (Amazon Web Services), Google Cloud Platform (GCP) veya Microsoft Azure gibi platformlar, esneklik, \u00f6l\u00e7eklenebilirlik ve geni\u015f hizmet yelpazesi sunar.\n<ul>\n<li><strong>Sanal Sunucular (Virtual Machines &#8211; EC2, Compute Engine):<\/strong> Kendi sunucunuzu tamamen kontrol edebilir ve API&#8217;nizi geleneksel y\u00f6ntemlerle da\u011f\u0131tabilirsiniz.<\/li>\n<li><strong>Sunucusuz (Serverless) Fonksiyonlar (AWS Lambda, Google Cloud Functions):<\/strong> API&#8217;nizi olay tabanl\u0131 fonksiyonlar olarak da\u011f\u0131tabilirsiniz. Bu, sadece istek geldi\u011finde kodunuzun \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve maliyetleri optimize eder. \u00d6zellikle kaz\u0131ma betikleri i\u00e7in de idealdir.<\/li>\n<li><strong>Kapsay\u0131c\u0131 Hizmetleri (Container Services &#8211; ECS, GKE, EKS):<\/strong> Docker konteynerlerinizi y\u00f6netmek i\u00e7in kullan\u0131l\u0131r, daha karma\u015f\u0131k ve \u00f6l\u00e7eklenebilir uygulamalar i\u00e7in uygundur.<\/li>\n<\/ul>\n<\/li>\n<li><strong>VPS (Virtual Private Server):<\/strong> DigitalOcean, Linode gibi sa\u011flay\u0131c\u0131lardan uygun fiyatl\u0131 VPS&#8217;ler kiralayarak kendi sunucu ortam\u0131n\u0131z\u0131 kurabilirsiniz. Daha fazla kontrol sunar ancak y\u00f6netim y\u00fck\u00fc de artar.<\/li>\n<\/ul>\n<p>Basit bir Flask veya FastAPI uygulamas\u0131 i\u00e7in bir VPS veya bulut platformundaki k\u00fc\u00e7\u00fck bir sanal sunucu ba\u015flang\u0131\u00e7 i\u00e7in yeterli olacakt\u0131r. \u00dcretim ortam\u0131nda, Gunicorn veya uWSGI gibi bir WSGI (Web Server Gateway Interface) sunucusu ile API&#8217;nizi \u00e7al\u0131\u015ft\u0131rmak ve Nginx veya Apache gibi bir web sunucusu ile ters proxy (reverse proxy) olarak yap\u0131land\u0131rmak standart bir yakla\u015f\u0131md\u0131r. Bu, statik dosyalar\u0131n sunulmas\u0131, SSL sonland\u0131rma ve y\u00fck dengeleme gibi g\u00f6revleri \u00fcstlenir.<\/p>\n<h3>Kapsay\u0131c\u0131la\u015ft\u0131rma (Containerization) ile Docker<\/h3>\n<p>Docker, uygulamalar\u0131m\u0131z\u0131 ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tek bir ta\u015f\u0131nabilir &#8220;kapsay\u0131c\u0131&#8221; (container) i\u00e7inde paketlememizi sa\u011flar. Bu, uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# Dockerfile \u00f6rne\u011fi\n# Python 3.9 tabanl\u0131 bir imaj kullan\nFROM python:3.9-slim-buster\n\n# \u00c7al\u0131\u015fma dizinini ayarla\nWORKDIR \/app\n\n# Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kopyala ve y\u00fckle\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Uygulama kodunu kopyala\nCOPY . .\n\n# Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 portu belirt\nEXPOSE 5000\n\n# Gunicorn ile Flask uygulamas\u0131n\u0131 ba\u015flat (veya uWSGI, FastAPI i\u00e7in Uvicorn)\nCMD [\"gunicorn\", \"-w\", \"4\", \"-b\", \"0.0.0.0:5000\", \"app:app\"]\n  <\/code><\/pre>\n<\/div>\n<p>Bu <code class=\"language-html\">Dockerfile<\/code>, uygulaman\u0131z\u0131n bir Docker imaj\u0131na nas\u0131l d\u00f6n\u00fc\u015ft\u00fcr\u00fclece\u011fini g\u00f6sterir. <code class=\"language-html\">gunicorn<\/code>, \u00fcretim ortam\u0131nda Flask uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan pop\u00fcler bir WSGI sunucusudur. Docker kullanmak, da\u011f\u0131t\u0131m s\u00fcrecini basitle\u015ftirir ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik ve \u00d6nbellekleme (Caching)<\/h3>\n<p>API&#8217;miz kay\u0131ts\u0131z oldu\u011fu i\u00e7in, beklenenden daha fazla trafik alabilir. Bu nedenle \u00f6l\u00e7eklenebilirlik \u00f6nemlidir:<\/p>\n<ul>\n<li><strong>Yatay \u00d6l\u00e7ekleme (Horizontal Scaling):<\/strong> API&#8217;nin birden fazla kopyas\u0131n\u0131 (instance) \u00e7al\u0131\u015ft\u0131rarak gelen istekleri bu kopyalar aras\u0131nda da\u011f\u0131tmak. Y\u00fck dengeleyici (load balancer) bu i\u015flemi y\u00f6netir.<\/li>\n<li><strong>\u00d6nbellekleme (Caching):<\/strong> En s\u0131k eri\u015filen verileri veya API yan\u0131tlar\u0131n\u0131 h\u0131zl\u0131 eri\u015fimli bir depoda (\u00f6rne\u011fin, Redis veya Memcached) tutmak. Bu, veritaban\u0131na veya diskteki <code class=\"language-html\">JSON<\/code> dosyalar\u0131na yap\u0131lan tekrar eden istekleri azalt\u0131r ve yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.\n<div class=\"code-container\">\n<pre><code>\n# Flask ile basit bir \u00f6nbellekleme \u00f6rne\u011fi (Flask-Caching k\u00fct\u00fcphanesi ile)\nfrom flask import Flask, jsonify\nfrom flask_caching import Cache\nimport json\nfrom datetime import datetime\n\napp = Flask(__name__)\ncache = Cache(app, config={'CACHE_TYPE': 'simple'}) # Basit bellek i\u00e7i \u00f6nbellek\n\n# ... (data_store ve load_data_from_disk fonksiyonlar\u0131 \u00f6nceki gibi) ...\n\n@app.route('\/api\/v1\/hava_durumu', methods=['GET'])\n@cache.cached(timeout=300) # Yan\u0131t\u0131 300 saniye (5 dakika) \u00f6nbelle\u011fe al\ndef get_hava_durumu():\n    load_data_from_disk()\n    return jsonify(data_store.get(\"hava_durumu\", []))\n          <\/code><\/pre>\n<\/p><\/div>\n<\/li>\n<\/ul>\n<p>Kaz\u0131ma betiklerinin de ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenmesi ve API sunucusundan ayr\u0131 \u00e7al\u0131\u015fmas\u0131 \u00f6nemlidir. Bu, bir kaz\u0131ma hatas\u0131n\u0131n API&#8217;yi etkilememesini sa\u011flar.<\/p>\n<h3>G\u00fcnl\u00fck \u0130zleme (Logging) ve Hata Y\u00f6netimi<\/h3>\n<p>API&#8217;mizin ve kaz\u0131ma betiklerimizin s\u00fcrekli olarak izlenmesi, sorunlar\u0131 h\u0131zl\u0131ca tespit etmek i\u00e7in elzemdir. T\u00fcm hatalar, uyar\u0131lar ve \u00f6nemli olaylar g\u00fcnl\u00fcklenmelidir. Loglar\u0131 merkezi bir yerde (\u00f6rne\u011fin, ELK Stack, Grafana Loki) toplamak ve analiz etmek, sistemin sa\u011fl\u0131\u011f\u0131 hakk\u0131nda de\u011ferli bilgiler sa\u011flar. Ayr\u0131ca, kaz\u0131ma betiklerinin ba\u015far\u0131s\u0131z olmas\u0131 durumunda otomatik bildirimler (e-posta, Slack) g\u00f6ndermek, veri g\u00fcncelli\u011fini korumak i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h3>Veri Kaynaklar\u0131ndaki De\u011fi\u015fikliklere Uyum<\/h3>\n<p>Web sitelerinin yap\u0131s\u0131 zamanla de\u011fi\u015febilir. Bu, kaz\u0131ma betiklerimizin bozulmas\u0131na neden olabilir. Bu duruma kar\u015f\u0131 haz\u0131rl\u0131kl\u0131 olmak i\u00e7in:<\/p>\n<ul>\n<li>Kaz\u0131ma betiklerini d\u00fczenli olarak test edin.<\/li>\n<li>Kaz\u0131ma hatalar\u0131n\u0131 izleyin ve bildirim al\u0131n.<\/li>\n<li>Betikleri kolayca g\u00fcncelleyebilecek bir yap\u0131 kurun.<\/li>\n<li>M\u00fcmk\u00fcnse, sitelerdeki belirli HTML elemanlar\u0131na ba\u011f\u0131ml\u0131 olmak yerine, daha genel desenleri veya API&#8217;leri (e\u011fer varsa) kullanmaya \u00e7al\u0131\u015f\u0131n.<\/li>\n<\/ul>\n<p>API&#8217;mizin da\u011f\u0131t\u0131m\u0131 ve bak\u0131m\u0131, projenin sadece teknik bir par\u00e7as\u0131 de\u011fil, ayn\u0131 zamanda s\u00fcrekli bir operasyonel sorumluluktur. Bu ad\u0131mlar\u0131 do\u011fru bir \u015fekilde uygulamak, API&#8217;mizin uzun \u00f6m\u00fcrl\u00fc ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h2>G\u00fcvenlik, Performans ve Geli\u015fmi\u015f Optimizasyon Teknikleri<\/h2>\n<p>Bir API&#8217;yi kay\u0131ts\u0131z olarak sunmak, eri\u015filebilirli\u011fi art\u0131r\u0131rken, ayn\u0131 zamanda baz\u0131 g\u00fcvenlik ve performans zorluklar\u0131n\u0131 da beraberinde getirir. Bu b\u00f6l\u00fcmde, bu zorluklar\u0131n \u00fcstesinden gelmek ve API&#8217;mizi daha sa\u011flam, h\u0131zl\u0131 ve verimli hale getirmek i\u00e7in ileri d\u00fczey tekniklere odaklanaca\u011f\u0131z.<\/p>\n<h3>G\u00fcvenlik \u00d6nlemleri<\/h3>\n<p>Kay\u0131ts\u0131z bir API, k\u00f6t\u00fc niyetli kullan\u0131c\u0131lar\u0131n veya botlar\u0131n a\u015f\u0131r\u0131 isteklerle sistemi kilitleme (DDoS sald\u0131r\u0131lar\u0131) veya kaynaklar\u0131 s\u00f6m\u00fcrme potansiyeli ta\u015f\u0131r. Bu riskleri azaltmak i\u00e7in a\u015fa\u011f\u0131daki \u00f6nlemler al\u0131nmal\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>\u0130stek S\u0131n\u0131rlama (Rate Limiting):<\/strong> Bu, belirli bir IP adresinden veya belirli bir zaman diliminde yap\u0131labilecek istek say\u0131s\u0131n\u0131 k\u0131s\u0131tlar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n dakikada en fazla 100 istek yapmas\u0131na izin verilebilir. Flask i\u00e7in <code class=\"language-html\">Flask-Limiter<\/code>, FastAPI i\u00e7in ise kendi iste\u011fe ba\u011fl\u0131 middleware (ara katman yaz\u0131l\u0131m\u0131) \u00e7\u00f6z\u00fcmleri mevcuttur. Bu, sunucunuzun a\u015f\u0131r\u0131 y\u00fcklenmesini \u00f6nler ve hizmetin s\u00fcreklili\u011fini sa\u011flar.<\/li>\n<li><strong>Web Uygulama G\u00fcvenlik Duvar\u0131 (WAF &#8211; Web Application Firewall):<\/strong> Cloudflare, AWS WAF gibi hizmetler, API&#8217;nizi k\u00f6t\u00fc niyetli trafikten, SQL enjeksiyonu (SQL injection) veya \u00e7apraz site betik \u00e7al\u0131\u015ft\u0131rma (cross-site scripting &#8211; XSS) gibi yayg\u0131n web sald\u0131r\u0131lar\u0131ndan korur. Bu hizmetler, API&#8217;nizin \u00f6n\u00fcnde bir kalkan g\u00f6revi g\u00f6r\u00fcr.<\/li>\n<li><strong>HTTPS Kullan\u0131m\u0131:<\/strong> T\u00fcm API ileti\u015fiminin HTTPS (Hypertext Transfer Protocol Secure) \u00fczerinden yap\u0131lmas\u0131 zorunludur. Bu, verilerin \u015fifrelenmesini ve iletim s\u0131ras\u0131nda gizlili\u011finin korunmas\u0131n\u0131 sa\u011flar. Let&#8217;s Encrypt gibi \u00fccretsiz sertifika sa\u011flay\u0131c\u0131lar\u0131 ile kolayca HTTPS etkinle\u015ftirilebilir.<\/li>\n<li><strong>Veri Do\u011frulama ve Temizleme:<\/strong> API&#8217;nizden d\u00f6nen verilerin temiz ve g\u00fcvenli oldu\u011fundan emin olun. Kaz\u0131ma s\u0131ras\u0131nda elde edilen verilerde k\u00f6t\u00fc ama\u00e7l\u0131 betikler veya istenmeyen karakterler bulunabilir. Bu verileri API yan\u0131t\u0131na dahil etmeden \u00f6nce kapsaml\u0131 bir \u015fekilde temizlemek (sanitization) \u00f6nemlidir.<\/li>\n<\/ul>\n<h3>Performans Optimizasyonu<\/h3>\n<p>API&#8217;nin h\u0131zl\u0131 ve duyarl\u0131 olmas\u0131, kullan\u0131c\u0131 deneyimi i\u00e7in kritik \u00f6neme sahiptir. A\u015fa\u011f\u0131daki teknikler performans\u0131 art\u0131rmaya yard\u0131mc\u0131 olacakt\u0131r:<\/p>\n<ul>\n<li><strong>Geli\u015fmi\u015f \u00d6nbellekleme Stratejileri:<\/strong>\n<ul>\n<li><strong>Veri Katman\u0131 \u00d6nbellekleme:<\/strong> Kaz\u0131nan verileri veritaban\u0131na kaydetmeden \u00f6nce veya kaydettikten sonra Redis veya Memcached gibi h\u0131zl\u0131 bellek i\u00e7i depolarda tutmak. API iste\u011fi geldi\u011finde, veritaban\u0131na gitmek yerine \u00f6nbellekten \u00e7ekilir.<\/li>\n<li><strong>API Yan\u0131t\u0131 \u00d6nbellekleme:<\/strong> Belirli u\u00e7 noktalar\u0131n yan\u0131tlar\u0131n\u0131 belirli bir s\u00fcre boyunca \u00f6nbellekte tutmak. Bu, ayn\u0131 iste\u011fin tekrar gelmesi durumunda h\u0131zl\u0131ca yan\u0131t verilmesini sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Asenkron \u0130\u015flemler (Async\/Await):<\/strong> Python&#8217;da <code class=\"language-html\">asyncio<\/code> ve FastAPI gibi framework&#8217;ler, e\u015f zamanl\u0131 (concurrent) i\u015flemleri y\u00f6netmek i\u00e7in asenkron programlama modelini destekler. Bu, API&#8217;nizin ayn\u0131 anda birden fazla iste\u011fi daha verimli bir \u015fekilde i\u015flemesini sa\u011flar, \u00f6zellikle I\/O yo\u011fun (veri taban\u0131 eri\u015fimi, harici API \u00e7a\u011fr\u0131lar\u0131) i\u015flemler i\u00e7in performans\u0131 art\u0131r\u0131r.\n<div class=\"code-container\">\n<pre><code>\n# FastAPI ile asenkron bir u\u00e7 nokta \u00f6rne\u011fi\nfrom fastapi import FastAPI\nimport asyncio\nimport httpx # Asenkron HTTP istemcisi\n\napp = FastAPI()\n\n# Asenkron veri \u00e7ekme fonksiyonu (\u00f6rne\u011fin, bir veritaban\u0131ndan veya diskten)\nasync def get_async_data():\n    await asyncio.sleep(0.05) # Veri \u00e7ekme sim\u00fclasyonu\n    return {\"mesaj\": \"Asenkron veri \u00e7ekildi!\"}\n\n@app.get(\"\/api\/v1\/async_veri\")\nasync def read_async_veri():\n    data = await get_async_data()\n    return data\n          <\/code><\/pre>\n<\/p><\/div>\n<\/li>\n<li><strong>Veritaban\u0131 Optimizasyonu:<\/strong> E\u011fer bir veritaban\u0131 kullan\u0131l\u0131yorsa, sorgular\u0131n optimize edilmesi, do\u011fru indekslerin (index) kullan\u0131lmas\u0131 ve ba\u011flant\u0131 havuzlama (connection pooling) gibi teknikler performans\u0131 art\u0131rabilir.<\/li>\n<li><strong>CDN (Content Delivery Network) Kullan\u0131m\u0131:<\/strong> \u00d6zellikle statik varl\u0131klar veya \u00e7ok s\u0131k de\u011fi\u015fmeyen veriler i\u00e7in CDN kullanmak, yan\u0131t s\u00fcrelerini azalt\u0131r ve co\u011frafi olarak da\u011f\u0131t\u0131lm\u0131\u015f kullan\u0131c\u0131lara daha h\u0131zl\u0131 hizmet sunar.<\/li>\n<\/ul>\n<h3>Geli\u015fmi\u015f Optimizasyon Teknikleri<\/h3>\n<ul>\n<li><strong>Veri S\u0131k\u0131\u015ft\u0131rma (Data Compression):<\/strong> API yan\u0131tlar\u0131n\u0131 gzip gibi y\u00f6ntemlerle s\u0131k\u0131\u015ft\u0131rmak, a\u011f bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 azalt\u0131r ve yan\u0131t s\u00fcrelerini h\u0131zland\u0131r\u0131r. \u00c7o\u011fu web sunucusu (Nginx) veya framework (Flask-Compress) bu \u00f6zelli\u011fi destekler.<\/li>\n<li><strong>HTTP\/2 Kullan\u0131m\u0131:<\/strong> HTTP\/2, ayn\u0131 TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla iste\u011fi paralel olarak g\u00f6ndermeye olanak tan\u0131yarak performans\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Monitoring ve Profiling:<\/strong> API&#8217;nizin performans\u0131n\u0131 s\u00fcrekli olarak izlemek (CPU, bellek kullan\u0131m\u0131, yan\u0131t s\u00fcreleri) ve darbo\u011fazlar\u0131 tespit etmek i\u00e7in profil olu\u015fturma (profiling) ara\u00e7lar\u0131 kullanmak, s\u00fcrekli optimizasyon i\u00e7in \u00f6nemlidir. Prometheus, Grafana, New Relic gibi ara\u00e7lar bu konuda yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong>Ak\u0131ll\u0131 Hata Y\u00f6netimi:<\/strong> API&#8217;nin hata durumlar\u0131nda anla\u015f\u0131l\u0131r ve bilgilendirici hata mesajlar\u0131 d\u00f6nmesi, geli\u015ftiricilerin sorunlar\u0131 daha h\u0131zl\u0131 \u00e7\u00f6zmesine yard\u0131mc\u0131 olur. Hata kodlar\u0131 (HTTP status codes) ve mesajlar\u0131 tutarl\u0131 olmal\u0131d\u0131r.<\/li>\n<\/ul>\n<p>Bu g\u00fcvenlik ve performans optimizasyonlar\u0131, kay\u0131ts\u0131z API&#8217;mizin sadece eri\u015filebilir olmakla kalmay\u0131p, ayn\u0131 zamanda g\u00fcvenilir, h\u0131zl\u0131 ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Verilerin s\u00fcrekli g\u00fcncellenmesi ve API&#8217;nin kesintisiz \u00e7al\u0131\u015fmas\u0131 i\u00e7in bu ad\u0131mlar\u0131n titizlikle uygulanmas\u0131 gerekmektedir.<\/p>\n<h2>Sonu\u00e7: A\u00e7\u0131k Veriye Eri\u015fimde Yeni Bir D\u00f6nem<\/h2>\n<p>25 g\u00fcnl\u00fck g\u00fcncellenen kamu veri sitesinden veri toplay\u0131p, kay\u0131ts\u0131z bir REST API arac\u0131l\u0131\u011f\u0131yla sunmak, a\u00e7\u0131k veri hareketine \u00f6nemli bir katk\u0131 sa\u011flamaktad\u0131r. Bu rehber boyunca ele ald\u0131\u011f\u0131m\u0131z ad\u0131mlar, veri toplama stratejilerinden API tasar\u0131m\u0131na, da\u011f\u0131t\u0131mdan g\u00fcvenlik ve performansa kadar projenin t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc kapsamaktad\u0131r. Bu t\u00fcr bir API, veriye eri\u015fimdeki b\u00fcrokratik engelleri ortadan kald\u0131rarak, geli\u015ftiricilerin, ara\u015ft\u0131rmac\u0131lar\u0131n ve hatta s\u0131radan vatanda\u015flar\u0131n kamu verilerinden daha kolay faydalanmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. B\u00f6ylece, yeni uygulamalar\u0131n, analizlerin ve hizmetlerin geli\u015ftirilmesine zemin haz\u0131rlar, inovasyonu te\u015fvik eder ve \u015feffafl\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<p>Kay\u0131ts\u0131z bir API, veri entegrasyon s\u00fcre\u00e7lerini basitle\u015ftirir, geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve projelerin daha h\u0131zl\u0131 hayata ge\u00e7mesine olanak tan\u0131r. Ancak, bu kolayl\u0131\u011f\u0131n getirdi\u011fi sorumluluklar da vard\u0131r: veri g\u00fcncelli\u011fini korumak, API&#8217;nin performans\u0131n\u0131 ve g\u00fcvenli\u011fini sa\u011flamak, veri kaynaklar\u0131ndaki de\u011fi\u015fikliklere uyum sa\u011flamak s\u00fcrekli bir \u00e7aba gerektirir. Do\u011fru ara\u00e7lar, stratejiler ve s\u00fcrekli bak\u0131m ile bu zorluklar\u0131n \u00fcstesinden gelinebilir ve a\u00e7\u0131k veriye eri\u015fimde ger\u00e7ekten yeni bir d\u00f6nem ba\u015flat\u0131labilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n        <strong>Bu API&#8217;yi kullanmak yasal m\u0131?<\/strong><\/p>\n<p>\u00c7o\u011fu kamu verisi, a\u00e7\u0131k veri prensipleri kapsam\u0131nda kamuya a\u00e7\u0131kt\u0131r ve kullan\u0131m\u0131 serbesttir. Ancak, her veri kayna\u011f\u0131n\u0131n kendi kullan\u0131m ko\u015fullar\u0131 ve <code class=\"language-html\">robots.txt<\/code> dosyas\u0131n\u0131 kontrol etmek \u00f6nemlidir. Ticari kullan\u0131m veya yeniden da\u011f\u0131t\u0131m i\u00e7in \u00f6zel izinler gerekebilir. Genel olarak, ki\u015fisel olmayan kamu verilerini kaz\u0131mak ve sunmak genellikle yasald\u0131r, ancak her zaman kayna\u011f\u0131n politikalar\u0131n\u0131 incelemeniz \u00f6nerilir.<\/p>\n<\/li>\n<li>\n        <strong>Veriler ne s\u0131kl\u0131kla g\u00fcncellenir?<\/strong><\/p>\n<p>API&#8217;mizdeki veriler, kaz\u0131ma betiklerimizin \u00e7al\u0131\u015fma s\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131 olarak g\u00fcncellenir. Bu rehberdeki senaryoda, verilerin g\u00fcnl\u00fck olarak g\u00fcncellendi\u011fi varsay\u0131lm\u0131\u015ft\u0131r. Her bir veri kayna\u011f\u0131 i\u00e7in ayr\u0131 bir kaz\u0131ma beti\u011fi, genellikle g\u00fcnde bir kez (\u00f6rne\u011fin, gece yar\u0131s\u0131) \u00e7al\u0131\u015ft\u0131r\u0131larak verilerin g\u00fcncel kalmas\u0131 sa\u011flan\u0131r. API yan\u0131tlar\u0131nda genellikle verinin en son ne zaman g\u00fcncellendi\u011fine dair bir zaman damgas\u0131 bulunur.<\/p>\n<\/li>\n<li>\n        <strong>API&#8217;ye ka\u00e7 istek yapabilirim?<\/strong><\/p>\n<p>API kay\u0131ts\u0131z olsa da, sunucu kaynaklar\u0131n\u0131 korumak ve hizmetin s\u00fcreklili\u011fini sa\u011flamak i\u00e7in istek s\u0131n\u0131rlamalar\u0131 (rate limiting) uygulanabilir. Bu s\u0131n\u0131rlamalar genellikle bir IP adresinden belirli bir zaman diliminde yap\u0131labilecek maksimum istek say\u0131s\u0131n\u0131 belirler (\u00f6rne\u011fin, dakikada 100 istek). A\u015f\u0131r\u0131 kullan\u0131m tespit edildi\u011finde, ge\u00e7ici olarak eri\u015fiminiz engellenebilir. API dok\u00fcmantasyonunda bu s\u0131n\u0131rlamalar belirtilmelidir.<\/p>\n<\/li>\n<li>\n        <strong>Hangi veri formatlar\u0131n\u0131 destekler?<\/strong><\/p>\n<p>Bu API, yayg\u0131n olarak kullan\u0131lan ve web tabanl\u0131 uygulamalar i\u00e7in ideal olan JSON (JavaScript Object Notation) format\u0131nda veri sunar. JSON, insan taraf\u0131ndan okunabilir ve bir\u00e7ok programlama dili taraf\u0131ndan kolayca ayr\u0131\u015ft\u0131r\u0131labilir bir formatt\u0131r. Gelecekte XML veya CSV gibi ba\u015fka formatlar da eklenebilir, ancak ba\u015flang\u0131\u00e7ta JSON ana odak noktas\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Kendi verilerimi ekleyebilir miyim veya API&#8217;yi \u00f6zelle\u015ftirebilir miyim?<\/strong><\/p>\n<p>Bu API, sadece bizim taraf\u0131m\u0131zdan toplanan kamu verilerini sunmak \u00fczere tasarlanm\u0131\u015ft\u0131r ve kullan\u0131c\u0131lar\u0131n do\u011frudan veri eklemesine veya mevcut verileri de\u011fi\u015ftirmesine izin vermez. Ancak, API&#8217;nin a\u00e7\u0131k kaynakl\u0131 olmas\u0131 durumunda, kendi sunucunuzda API&#8217;nin bir kopyas\u0131n\u0131 da\u011f\u0131tabilir, kendi veri kaynaklar\u0131n\u0131z\u0131 ekleyebilir veya mevcut u\u00e7 noktalar\u0131 (endpoints) kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re \u00f6zelle\u015ftirebilirsiniz. Bu, projenin esnekli\u011fini ve adaptasyon yetene\u011fini art\u0131r\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p>#Teknoloji #WebGeli\u015ftirme #API #VeriToplama #RESTAPI<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/public-data-aggregator-rest-api\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/public-data-aggregator-rest-api<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fczde a\u00e7\u0131k veriye eri\u015fim, bir\u00e7ok geli\u015ftirici ve ara\u015ft\u0131rmac\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131maktad\u0131r.","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":[1],"tags":[],"class_list":{"0":"post-44517","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"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>25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fczde a\u00e7\u0131k veriye eri\u015fim, bir\u00e7ok geli\u015ftirici ve ara\u015ft\u0131rmac\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131maktad\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-04T18:10:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-04T18:11:20+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi\",\"datePublished\":\"2026-09-04T18:10:49+00:00\",\"dateModified\":\"2026-09-04T18:11:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\"},\"wordCount\":4916,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\",\"name\":\"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-09-04T18:10:49+00:00\",\"dateModified\":\"2026-09-04T18:11:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi\"}]},{\"@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":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi","og_description":"G\u00fcn\u00fcm\u00fczde a\u00e7\u0131k veriye eri\u015fim, bir\u00e7ok geli\u015ftirici ve ara\u015ft\u0131rmac\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131maktad\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-09-04T18:10:49+00:00","article_modified_time":"2026-09-04T18:11:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi","datePublished":"2026-09-04T18:10:49+00:00","dateModified":"2026-09-04T18:11:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/"},"wordCount":4916,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/","name":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-09-04T18:10:49+00:00","dateModified":"2026-09-04T18:11:20+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/25-gunluk-kamu-verisi-sitesi-icin-kayitsiz-rest-api-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"25 G\u00fcnl\u00fck Kamu Verisi Sitesi \u0130\u00e7in Kay\u0131ts\u0131z REST API Olu\u015fturma Rehberi"}]},{"@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\/44517","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=44517"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44517\/revisions"}],"predecessor-version":[{"id":44518,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44517\/revisions\/44518"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=44517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=44517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=44517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}