{"id":38733,"date":"2026-02-06T13:40:48","date_gmt":"2026-02-06T10:40:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38733"},"modified":"2026-02-06T13:40:48","modified_gmt":"2026-02-06T10:40:48","slug":"strapi-ile-guclu-bir-api-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/","title":{"rendered":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Modern web ve mobil uygulamalar, genellikle frontend ve backend katmanlar\u0131 aras\u0131nda veri al\u0131\u015fveri\u015fini sa\u011flayan g\u00fc\u00e7l\u00fc ve esnek API&#8217;lere ihtiya\u00e7 duyar. Bu API&#8217;lerin h\u0131zl\u0131 bir \u015fekilde geli\u015ftirilmesi, y\u00f6netilmesi ve \u00f6l\u00e7eklenebilmesi, proje ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. \u0130\u015fte tam bu noktada, a\u00e7\u0131k kaynak kodlu, Node.js tabanl\u0131 bir headless CMS olan Strapi devreye girer. Strapi, geli\u015ftiricilere dakikalar i\u00e7inde \u00f6zelle\u015ftirilebilir bir API olu\u015fturma imkan\u0131 sunarak i\u00e7erik y\u00f6netimini ve da\u011f\u0131t\u0131m\u0131n\u0131 basitle\u015ftirir. Bu makalede, Strapi ile s\u0131f\u0131rdan g\u00fc\u00e7l\u00fc bir API&#8217;nin nas\u0131l in\u015fa edilece\u011fini, i\u00e7erik modellerinin nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, API eri\u015fiminin nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ve frontend uygulamalar\u0131ndan bu API&#8217;nin nas\u0131l t\u00fcketilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Strapi Nedir ve Neden Tercih Edilmeli?<\/h3>\n<p>Strapi, geli\u015ftiricilere i\u00e7eriklerini y\u00f6netmeleri ve herhangi bir cihaza (web sitesi, mobil uygulama, IoT cihaz\u0131 vb.) da\u011f\u0131tmalar\u0131 i\u00e7in bir aray\u00fcz sa\u011flayan, tamamen a\u00e7\u0131k kaynakl\u0131 bir headless CMS&#8217;tir. &#8220;Headless&#8221; terimi, i\u00e7erik y\u00f6netim sisteminin (CMS) sunum katman\u0131ndan (frontend) ayr\u0131lm\u0131\u015f oldu\u011fu anlam\u0131na gelir. Geleneksel CMS&#8217;lerin aksine (\u00f6rne\u011fin WordPress), Strapi belirli bir frontend teknolojisine ba\u011fl\u0131 de\u011fildir. Bu, geli\u015ftiricilerin React, Vue, Angular, Svelte gibi istedikleri frontend framework&#8217;\u00fcn\u00fc veya mobil teknolojiyi kullanarak kendi kullan\u0131c\u0131 aray\u00fczlerini olu\u015fturmalar\u0131na olanak tan\u0131r.<\/p>\n<p>Peki, Strapi&#8217;yi tercih etmek i\u00e7in ba\u015fl\u0131ca nedenler nelerdir?<\/p>\n<p>*   <strong>A\u00e7\u0131k Kaynak ve \u00dccretsiz:<\/strong> Strapi&#8217;nin temel s\u00fcr\u00fcm\u00fc tamamen \u00fccretsizdir ve a\u00e7\u0131k kaynak kodlu olmas\u0131 sayesinde topluluk deste\u011fi ve s\u00fcrekli geli\u015fim avantaj\u0131 sunar. Bu, maliyetleri d\u00fc\u015f\u00fcr\u00fcrken esnekli\u011fi art\u0131r\u0131r.<br \/>\n*   <strong>Teknolojiden Ba\u011f\u0131ms\u0131z (Headless):<\/strong> Strapi, i\u00e7eriklerinizi herhangi bir platforma veya cihaza RESTful API veya GraphQL arac\u0131l\u0131\u011f\u0131yla da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu, gelecekteki teknoloji de\u011fi\u015fikliklerine uyum sa\u011flama ve farkl\u0131 platformlarda i\u00e7erik sunma esnekli\u011fi sa\u011flar.<br \/>\n*   <strong>Geli\u015ftirici Dostu:<\/strong> Node.js \u00fczerine in\u015fa edilmi\u015f olmas\u0131, JavaScript ekosistemine hakim geli\u015ftiriciler i\u00e7in \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcr\u00fcr. Y\u00f6netim paneli React ile yaz\u0131lm\u0131\u015ft\u0131r ve kullan\u0131c\u0131 dostu bir aray\u00fcz sunar.<br \/>\n*   <strong>Esneklik ve \u00d6zelle\u015ftirilebilirlik:<\/strong> Strapi, i\u00e7erik modellerinizi tamamen \u00f6zelle\u015ftirmenize olanak tan\u0131r. Ayr\u0131ca, \u00f6zel controller&#8217;lar, servisler, middleware&#8217;ler ve plugin&#8217;ler olu\u015fturarak API&#8217;nizin davran\u0131\u015f\u0131n\u0131 ve mant\u0131\u011f\u0131n\u0131 istedi\u011finiz gibi geni\u015fletebilirsiniz.<br \/>\n*   <strong>H\u0131zl\u0131 Geli\u015ftirme S\u00fcreci:<\/strong> \u0130\u00e7erik modellerini olu\u015fturduktan sonra, Strapi otomatik olarak g\u00fc\u00e7l\u00fc ve iyi belgelenmi\u015f bir RESTful API ve iste\u011fe ba\u011fl\u0131 olarak bir GraphQL API olu\u015fturur. Bu, API geli\u015ftirme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<br \/>\n*   <strong>Modern Teknoloji Y\u0131\u011f\u0131n\u0131:<\/strong> Node.js, React, Koa.js gibi modern teknolojileri kullan\u0131r. PostgreSQL, MySQL, SQLite ve MongoDB gibi \u00e7e\u015fitli veritabanlar\u0131n\u0131 destekler.<\/p>\n<p>Strapi, \u00f6zellikle dinamik i\u00e7erik gerektiren web siteleri, mobil uygulamalar, e-ticaret platformlar\u0131, bloglar ve kurumsal uygulamalar i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h3>Strapi Ortam\u0131n\u0131n Kurulumu<\/h3>\n<p>Strapi projesi olu\u015fturmak olduk\u00e7a basittir. Ba\u015flamadan \u00f6nce baz\u0131 \u00f6nko\u015fullara sahip olman\u0131z gerekir:<\/p>\n<p>*   <strong>Node.js:<\/strong> S\u00fcr\u00fcm 14.x, 16.x veya 18.x (LTS s\u00fcr\u00fcmleri \u00f6nerilir). Node.js ile birlikte npm de kurulur.<br \/>\n*   <strong>npm veya Yarn:<\/strong> Node.js ile birlikte gelen paket y\u00f6neticisi.<br \/>\n*   <strong>Veritaban\u0131:<\/strong> Strapi, SQLite (geli\u015ftirme i\u00e7in varsay\u0131lan), PostgreSQL, MySQL, MariaDB veya MongoDB gibi \u00e7e\u015fitli veritabanlar\u0131n\u0131 destekler. \u00dcretim ortamlar\u0131 i\u00e7in genellikle PostgreSQL veya MySQL tercih edilir.<\/p>\n<h4>Yeni Bir Strapi Projesi Olu\u015fturma<\/h4>\n<p>Komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">npx create-strapi-app@latest my-strapi-project --quickstart<\/code><\/pre>\n<p>*   <code>npx create-strapi-app@latest<\/code>: Strapi projesi olu\u015fturmak i\u00e7in kullan\u0131lan komut. <code>@latest<\/code> en g\u00fcncel s\u00fcr\u00fcm\u00fc kullanmay\u0131 sa\u011flar.<br \/>\n*   <code>my-strapi-project<\/code>: Projenizin ad\u0131. \u0130stedi\u011finiz ismi verebilirsiniz.<br \/>\n*   <code>--quickstart<\/code>: Bu bayrak, projenizi varsay\u0131lan ayarlarla (SQLite veritaban\u0131 ile) h\u0131zl\u0131ca ba\u015flat\u0131r ve otomatik olarak y\u00f6netim panelini a\u00e7ar. E\u011fer farkl\u0131 bir veritaban\u0131 kullanmak isterseniz bu bayra\u011f\u0131 kald\u0131rman\u0131z ve kurulum s\u0131ras\u0131nda se\u00e7enekleri manuel olarak belirlemeniz gerekir.<\/p>\n<p>Kurulum tamamland\u0131\u011f\u0131nda, Strapi otomatik olarak taray\u0131c\u0131n\u0131zda y\u00f6netim panelini a\u00e7acakt\u0131r (genellikle <code>http:\/\/localhost:1337\/admin<\/code>). \u0130lk kez a\u00e7t\u0131\u011f\u0131n\u0131zda bir y\u00f6netici hesab\u0131 olu\u015fturman\u0131z istenecektir. Gerekli bilgileri doldurarak y\u00f6netici panelinize giri\u015f yapabilirsiniz.<\/p>\n<h4>Veritaban\u0131 Yap\u0131land\u0131rmas\u0131 (\u00d6rnek: PostgreSQL)<\/h4>\n<p>E\u011fer <code>--quickstart<\/code> bayra\u011f\u0131n\u0131 kullanmad\u0131ysan\u0131z veya daha sonra veritaban\u0131n\u0131z\u0131 de\u011fi\u015ftirmek isterseniz, projenizin <code>config\/database.js<\/code> dosyas\u0131n\u0131 d\u00fczenlemeniz gerekir. \u0130\u015fte bir PostgreSQL yap\u0131land\u0131rma \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-javascript\">\/\/ config\/database.js\nconst path = require('path');\n\nmodule.exports = ({ env }) => ({\n  connection: {\n    client: 'postgres',\n    connection: {\n      host: env('DATABASE_HOST', '127.0.0.1'),\n      port: env.int('DATABASE_PORT', 5432),\n      database: env('DATABASE_NAME', 'strapi_db'),\n      user: env('DATABASE_USERNAME', 'strapi_user'),\n      password: env('DATABASE_PASSWORD', 'strapi_password'),\n      ssl: env.bool('DATABASE_SSL', false),\n    },\n    pool: {\n      min: env.int('DATABASE_POOL_MIN', 2),\n      max: env.int('DATABASE_POOL_MAX', 10),\n    },\n  },\n});<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rmada, veritaban\u0131 bilgileri ortam de\u011fi\u015fkenlerinden (<code>env<\/code>) okunur. Bu, \u00f6zellikle \u00fcretim ortam\u0131nda hassas bilgileri g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in en iyi uygulamad\u0131r. <code>.env<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki gibi de\u011fi\u015fkenleri ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-\">DATABASE_HOST=localhost\nDATABASE_PORT=5432\nDATABASE_NAME=my_strapi_database\nDATABASE_USERNAME=my_user\nDATABASE_PASSWORD=my_password<\/code><\/pre>\n<p>Veritaban\u0131 ba\u011flant\u0131n\u0131z\u0131 yap\u0131land\u0131rd\u0131ktan sonra, Strapi&#8217;yi ba\u015flatmak i\u00e7in projenizin k\u00f6k dizininde <code>npm run develop<\/code> veya <code>yarn develop<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h3>\u0130\u00e7erik Modelleri (Content Types) Olu\u015fturma<\/h3>\n<p>Strapi&#8217;nin kalbi, i\u00e7erik modelleri olu\u015fturma yetene\u011finde yatar. Bu modeller, API&#8217;nizin sunaca\u011f\u0131 verinin yap\u0131s\u0131n\u0131 tan\u0131mlar. Y\u00f6netim panelinde &#8220;Content-Type Builder&#8221; b\u00f6l\u00fcm\u00fcne giderek yeni i\u00e7erik modelleri olu\u015fturabilir veya mevcut olanlar\u0131 d\u00fczenleyebilirsiniz.<\/p>\n<h4>\u0130lk \u0130\u00e7erik Modeli: &#8220;Makale&#8221; (Article)<\/h4>\n<p>Bir blog i\u00e7in &#8220;Makale&#8221; ad\u0131nda bir i\u00e7erik modeli olu\u015ftural\u0131m.<\/p>\n<p>1.  <strong>&#8220;Content-Type Builder&#8221;<\/strong> b\u00f6l\u00fcm\u00fcne gidin.<br \/>\n2.  <strong>&#8220;Create new collection type&#8221;<\/strong> (Yeni koleksiyon tipi olu\u015ftur) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n3.  <strong>&#8220;Display name&#8221;<\/strong> (G\u00f6r\u00fcnen ad) olarak <code>Makale<\/code> (veya Article) girin. Strapi otomatik olarak API ID&#8217;sini <code>makale<\/code> veya <code>articles<\/code> olarak ayarlayacakt\u0131r.<br \/>\n4.  <strong>&#8220;Continue&#8221;<\/strong> (Devam) d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>\u015eimdi &#8220;Makale&#8221; i\u00e7erik modelimize alanlar (fields) ekleyelim:<\/p>\n<p>*   <strong>Ba\u015fl\u0131k (Title):<\/strong> <code>Text<\/code> tipi, <code>Short text<\/code>. Gerekli (Required) olarak i\u015faretlenebilir.<br \/>\n*   <strong>\u0130\u00e7erik (Content):<\/strong> <code>Rich text<\/code> tipi. Bu, zengin metin d\u00fczenleyici ile i\u00e7erik girmenizi sa\u011flar.<br \/>\n*   <strong>Kapak G\u00f6rseli (Cover Image):<\/strong> <code>Media<\/code> tipi. Tekil medya (Single media) veya \u00e7oklu medya (Multiple media) se\u00e7ene\u011fi sunar. Tekil medya se\u00e7elim.<br \/>\n*   <strong>Yay\u0131n Tarihi (Published Date):<\/strong> <code>Date<\/code> tipi, <code>Date and time<\/code>.<br \/>\n*   <strong>Slug:<\/strong> <code>Text<\/code> tipi, <code>Short text<\/code>. Makale URL&#8217;leri i\u00e7in benzersiz bir tan\u0131mlay\u0131c\u0131. Benzersiz (Unique) olarak i\u015faretlenebilir.<\/p>\n<p>Her alan\u0131 ekledikten sonra &#8220;Add another field&#8221; (Ba\u015fka alan ekle) se\u00e7ene\u011fini kullan\u0131n. T\u00fcm alanlar\u0131 ekledikten sonra &#8220;Finish&#8221; (Bitir) ve ard\u0131ndan sa\u011f \u00fcst k\u00f6\u015fedeki &#8220;Save&#8221; (Kaydet) d\u00fc\u011fmesine t\u0131klay\u0131n. Strapi, veritaban\u0131 \u015femas\u0131n\u0131 g\u00fcncelleyecek ve sunucuyu yeniden ba\u015flatacakt\u0131r.<\/p>\n<h4>\u0130kinci \u0130\u00e7erik Modeli: &#8220;Kategori&#8221; (Category)<\/h4>\n<p>Makalelerimizi kategorize etmek i\u00e7in bir &#8220;Kategori&#8221; i\u00e7erik modeli olu\u015ftural\u0131m.<\/p>\n<p>1.  Yine &#8220;Content-Type Builder&#8221; b\u00f6l\u00fcm\u00fcnden <strong>&#8220;Create new collection type&#8221;<\/strong> se\u00e7ene\u011fini se\u00e7in.<br \/>\n2.  <strong>&#8220;Display name&#8221;<\/strong> olarak <code>Kategori<\/code> (veya Category) girin.<br \/>\n3.  Alanlar:<br \/>\n    *   <strong>\u0130sim (Name):<\/strong> <code>Text<\/code> tipi, <code>Short text<\/code>. Gerekli ve Benzersiz.<br \/>\n    *   <strong>A\u00e7\u0131klama (Description):<\/strong> <code>Rich text<\/code> tipi.<\/p>\n<p>Kaydedin ve sunucunun yeniden ba\u015flamas\u0131n\u0131 bekleyin.<\/p>\n<h4>\u0130li\u015fkiler (Relations) Kurma<\/h4>\n<p>\u0130ki i\u00e7erik modeli aras\u0131nda ili\u015fki kurmak, verileri daha anlaml\u0131 hale getirir. \u015eimdi &#8220;Makale&#8221; ile &#8220;Kategori&#8221; aras\u0131nda bir ili\u015fki kural\u0131m:<\/p>\n<p>1.  &#8220;Content-Type Builder&#8221; b\u00f6l\u00fcm\u00fcnde <strong>&#8220;Makale&#8221;<\/strong> modelini d\u00fczenlemek i\u00e7in t\u0131klay\u0131n.<br \/>\n2.  <strong>&#8220;Add another field&#8221;<\/strong> d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n3.  <code>Relation<\/code> tipini se\u00e7in.<br \/>\n4.  Sol tarafta <code>Makale<\/code> modelini g\u00f6receksiniz. Sa\u011f tarafta <code>Kategori<\/code> modelini se\u00e7in.<br \/>\n5.  \u0130li\u015fki t\u00fcr\u00fcn\u00fc se\u00e7in: &#8220;Makale has and belongs to one Kategori&#8221; (Bir makale bir kategoriye aittir). Bu, bire \u00e7ok (Many-to-one) ili\u015fkidir. Bir kategoriye birden fazla makale ait olabilir, ancak bir makale yaln\u0131zca bir kategoriye aittir.<br \/>\n6.  \u0130li\u015fki alan\u0131na <code>kategori<\/code> (veya category) ismini verin.<br \/>\n7.  Kaydedin.<\/p>\n<p>Art\u0131k i\u00e7erik olu\u015ftururken bir makaleye bir kategori atayabilirsiniz.<\/p>\n<h3>API Eri\u015fim \u0130zinlerini Yap\u0131land\u0131rma<\/h3>\n<p>Strapi, g\u00fcvenlik ve eri\u015fim kontrol\u00fc i\u00e7in g\u00fc\u00e7l\u00fc bir rol ve izin sistemi sunar. Varsay\u0131lan olarak, olu\u015fturdu\u011funuz i\u00e7erik modelleri i\u00e7in API endpoint&#8217;leri herkese a\u00e7\u0131k de\u011fildir. Bu endpoint&#8217;lere d\u0131\u015far\u0131dan eri\u015filebilmesi i\u00e7in izinleri manuel olarak yap\u0131land\u0131rman\u0131z gerekir.<\/p>\n<p>1.  Y\u00f6netim panelinde sol men\u00fcden <strong>&#8220;Settings&#8221;<\/strong> (Ayarlar) -> <strong>&#8220;Roles&#8221;<\/strong> (Roller) b\u00f6l\u00fcm\u00fcne gidin.<br \/>\n2.  <code>Public<\/code> (Herkese A\u00e7\u0131k) rol\u00fcne t\u0131klay\u0131n. Bu rol, kimlik do\u011frulamas\u0131 yapmam\u0131\u015f t\u00fcm kullan\u0131c\u0131lar\u0131n eri\u015fim izinlerini tan\u0131mlar.<br \/>\n3.  A\u015fa\u011f\u0131 kayd\u0131rarak olu\u015fturdu\u011funuz i\u00e7erik modellerini g\u00f6receksiniz (<code>Makale<\/code>, <code>Kategori<\/code>).<br \/>\n4.  <code>Makale<\/code> ve <code>Kategori<\/code> alt\u0131nda, <code>find<\/code> (t\u00fcm makaleleri\/kategorileri getir) ve <code>findOne<\/code> (belirli bir makaleyi\/kategoriyi ID&#8217;ye g\u00f6re getir) se\u00e7eneklerini i\u015faretleyin. Bu, herkese a\u00e7\u0131k API&#8217;nin bu verilere okuma (GET) eri\u015fimi olmas\u0131n\u0131 sa\u011flar.<br \/>\n5.  <strong>&#8220;Save&#8221;<\/strong> (Kaydet) d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>E\u011fer kimlik do\u011frulamas\u0131 gerektiren (\u00f6rne\u011fin kullan\u0131c\u0131 giri\u015fi yapm\u0131\u015f) kullan\u0131c\u0131lar\u0131n da i\u00e7erik olu\u015fturma, g\u00fcncelleme veya silme gibi i\u015flemleri yapmas\u0131n\u0131 istiyorsan\u0131z, <code>Authenticated<\/code> (Kimli\u011fi Do\u011frulanm\u0131\u015f) rol\u00fc i\u00e7in ilgili izinleri ayarlaman\u0131z gerekir. Ayr\u0131ca, daha gran\u00fcler kontrol i\u00e7in \u00f6zel roller de olu\u015fturabilirsiniz.<\/p>\n<h3>Strapi Taraf\u0131ndan Otomatik Olu\u015fturulan API&#8217;yi Ke\u015ffetme<\/h3>\n<p>\u0130\u00e7erik modellerinizi ve izinlerinizi yap\u0131land\u0131rd\u0131ktan sonra, Strapi otomatik olarak RESTful API endpoint&#8217;lerini sizin i\u00e7in olu\u015fturur. E\u011fer GraphQL plugin&#8217;ini kurduysan\u0131z, GraphQL API&#8217;niz de haz\u0131r olacakt\u0131r.<\/p>\n<h4>REST API<\/h4>\n<p>Strapi projeniz \u00e7al\u0131\u015f\u0131r durumdayken (genellikle <code>http:\/\/localhost:1337<\/code>), taray\u0131c\u0131n\u0131zdan veya bir API istemcisinden (Postman, Insomnia) a\u015fa\u011f\u0131daki endpoint&#8217;lere eri\u015febilirsiniz:<\/p>\n<p>*   <strong>T\u00fcm Makaleleri Getir:<\/strong> <code>GET http:\/\/localhost:1337\/api\/makaleler<\/code><br \/>\n*   <strong>Belirli Bir Makaleyi Getir:<\/strong> <code>GET http:\/\/localhost:1337\/api\/makaleler\/:id<\/code> (\u00f6rne\u011fin <code>http:\/\/localhost:1337\/api\/makaleler\/1<\/code>)<br \/>\n*   <strong>T\u00fcm Kategorileri Getir:<\/strong> <code>GET http:\/\/localhost:1337\/api\/kategoriler<\/code><\/p>\n<p><strong>Sorgu Parametreleri:<\/strong><\/p>\n<p>Strapi API&#8217;si, verileri filtrelemek, s\u0131ralamak, sayfaland\u0131rmak ve ili\u015fkili verileri \u00e7ekmek i\u00e7in g\u00fc\u00e7l\u00fc sorgu parametreleri sunar.<\/p>\n<p>*   <strong>\u0130li\u015fkili Verileri \u00c7ekme (<code>populate<\/code>):<\/strong> Makaleleri getirirken ili\u015fkili kategoriyi de \u00e7ekmek i\u00e7in <code>populate<\/code> parametresini kullan\u0131n:<br \/>\n    <code>GET http:\/\/localhost:1337\/api\/makaleler?populate=kategori<\/code><br \/>\n    Bu, her makale objesi i\u00e7inde ili\u015fkili kategori objesinin de gelmesini sa\u011flar. E\u011fer birden fazla ili\u015fkiyi populate etmek isterseniz: <code>?populate[0]=kategori&populate[1]=yazar<\/code> gibi bir yap\u0131 kullanabilirsiniz.<br \/>\n*   <strong>Filtreleme (<code>filters<\/code>):<\/strong> Belirli kriterlere g\u00f6re makaleleri filtrelemek i\u00e7in:<br \/>\n    <code>GET http:\/\/localhost:1337\/api\/makaleler?filters[baslik][$contains]=Strapi<\/code> (Ba\u015fl\u0131\u011f\u0131nda &#8220;Strapi&#8221; ge\u00e7en makaleler)<br \/>\n    <code>GET http:\/\/localhost:1337\/api\/makaleler?filters[kategori][isim][$eq]=Teknoloji<\/code> (Kategori ad\u0131 &#8220;Teknoloji&#8221; olan makaleler)<br \/>\n*   <strong>S\u0131ralama (<code>sort<\/code>):<\/strong> Makaleleri yay\u0131n tarihine g\u00f6re azalan s\u0131rada s\u0131ralamak i\u00e7in:<br \/>\n    <code>GET http:\/\/localhost:1337\/api\/makaleler?sort=yayinTarihi:desc<\/code><br \/>\n*   <strong>Sayfaland\u0131rma (<code>pagination<\/code>):<\/strong> Belirli bir sayfadaki belirli say\u0131da makaleyi almak i\u00e7in:<br \/>\n    <code>GET http:\/\/localhost:1337\/api\/makaleler?pagination[page]=1&pagination[pageSize]=10<\/code> (1. sayfadaki 10 makale)<\/p>\n<p>Strapi&#8217;nin API belgeleri (genellikle <code>http:\/\/localhost:1337\/documentation<\/code> adresinde bulunur, e\u011fer <code>documentation<\/code> plugin&#8217;i kuruluysa), t\u00fcm bu parametreleri ve daha fazlas\u0131n\u0131 detayl\u0131 olarak a\u00e7\u0131klar.<\/p>\n<h4>GraphQL API<\/h4>\n<p>Strapi, GraphQL deste\u011fi i\u00e7in bir plugin sunar. Kurulum i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">npm install @strapi\/plugin-graphql\n<h2>veya<\/h2>\nyarn add @strapi\/plugin-graphql<\/code><\/pre>\n<p>Ard\u0131ndan Strapi sunucunuzu yeniden ba\u015flat\u0131n. Kurulumdan sonra, y\u00f6netim panelinde <code>Settings<\/code> -> <code>GraphQL<\/code> b\u00f6l\u00fcm\u00fcnden GraphQL ayarlar\u0131n\u0131 yapabilirsiniz. Genellikle <code>http:\/\/localhost:1337\/graphql<\/code> adresinde bir GraphQL Playground aray\u00fcz\u00fc eri\u015filebilir hale gelir.<\/p>\n<p><strong>\u00d6rnek GraphQL Sorgular\u0131:<\/strong><\/p>\n<p>*   <strong>T\u00fcm Makaleleri Getir:<\/strong><\/p>\n<pre><code class=\"language-graphql\">query {\n      articles {\n        data {\n          id\n          attributes {\n            baslik\n            icerik\n            yayinTarihi\n            kategori {\n              data {\n                attributes {\n                  isim\n                }\n              }\n            }\n          }\n        }\n      }\n    }<\/code><\/pre>\n<p>*   <strong>Belirli Bir Makaleyi ID&#8217;ye G\u00f6re Getir:<\/strong><\/p>\n<pre><code class=\"language-graphql\">query {\n      article(id: \"1\") {\n        data {\n          id\n          attributes {\n            baslik\n            icerik\n            yayinTarihi\n            kategori {\n              data {\n                attributes {\n                  isim\n                }\n              }\n            }\n          }\n        }\n      }\n    }<\/code><\/pre>\n<p>GraphQL, API t\u00fcketicisinin tam olarak hangi alanlara ihtiyac\u0131 oldu\u011funu belirtmesine izin vererek gereksiz veri transferini \u00f6nler ve tek bir istekte birden fazla kaynak \u00e7ekme esnekli\u011fi sunar.<\/p>\n<h3>Frontend Uygulamas\u0131ndan API&#8217;yi T\u00fcketme<\/h3>\n<p>Strapi API&#8217;sini bir frontend uygulamas\u0131ndan t\u00fcketmek, herhangi bir RESTful veya GraphQL API&#8217;sini t\u00fcketmek gibidir. A\u015fa\u011f\u0131da basit bir JavaScript (React, Vue veya Angular fark etmeksizin kullan\u0131labilecek) \u00f6rne\u011fi verilmi\u015ftir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: Makaleleri \u00e7ekme ve g\u00f6sterme\nasync function getArticles() {\n  try {\n    const response = await fetch('http:\/\/localhost:1333\/api\/makaleler?populate=kategori');\n    const data = await response.json();\n\n    const articles = data.data.map(item => ({\n      id: item.id,\n      title: item.attributes.baslik,\n      content: item.attributes.icerik,\n      publishedDate: new Date(item.attributes.yayinTarihi).toLocaleDateString(),\n      category: item.attributes.kategori.data ? item.attributes.kategori.data.attributes.isim : 'Yok',\n      coverImage: item.attributes.kapakGorseli.data ? <code>http:\/\/localhost:1333${item.attributes.kapakGorseli.data.attributes.url}<\/code> : null,\n    }));\n\n    console.log('Makaleler:', articles);\n\n    \/\/ Bu verileri React state'ine, Vue data's\u0131na veya Angular bile\u015fenine ba\u011flayabilirsiniz.\n    \/\/ \u00d6rne\u011fin, bir liste olarak HTML'e render etme:\n    const articlesList = document.getElementById('articles-list');\n    articles.forEach(article => {\n      const articleDiv = document.createElement('div');\n      articleDiv.innerHTML = <code>\n        <h3>${article.title}<\/h3>\n        <p>Kategori: ${article.category}<\/p>\n        <p>Yay\u0131n Tarihi: ${article.publishedDate}<\/p>\n        ${article.coverImage ? <\/code><img decoding=\"async\" src=\"${article.coverImage}\" alt=\"${article.title}\" style=\"max-width: 200px;\"><code> : ''}\n        <p>${article.content.substring(0, 150)}...<\/p>\n        <hr>\n      <\/code>;\n      articlesList.appendChild(articleDiv);\n    });\n\n  } catch (error) {\n    console.error('Makaleler \u00e7ekilirken bir hata olu\u015ftu:', error);\n  }\n}\n\n\/\/ Sayfa y\u00fcklendi\u011finde makaleleri \u00e7ek\ndocument.addEventListener('DOMContentLoaded', getArticles);<\/code><\/pre>\n<p><strong>Dikkat Edilmesi Gerekenler:<\/strong><\/p>\n<p>*   <strong>CORS (Cross-Origin Resource Sharing):<\/strong> Frontend uygulaman\u0131z farkl\u0131 bir domain veya portta \u00e7al\u0131\u015f\u0131yorsa, Strapi&#8217;nin CORS ayarlar\u0131n\u0131 yapman\u0131z gerekebilir. Strapi varsay\u0131lan olarak t\u00fcm origin&#8217;lerden gelen isteklere izin verir, ancak \u00fcretim ortam\u0131nda bunu belirli origin&#8217;lerle k\u0131s\u0131tlamak g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir. <code>config\/middlewares.js<\/code> dosyas\u0131nda CORS ayarlar\u0131n\u0131 bulabilirsiniz.<br \/>\n*   <strong>Medya Dosyalar\u0131:<\/strong> Strapi, y\u00fcklenen medya dosyalar\u0131n\u0131 genellikle <code>http:\/\/localhost:1337\/uploads\/<\/code> gibi bir yolda sunar. API&#8217;den gelen <code>url<\/code> alan\u0131n\u0131 kullanarak bu dosyalara eri\u015febilirsiniz.<br \/>\n*   <strong>Hata Y\u00f6netimi:<\/strong> API isteklerinde olu\u015fabilecek a\u011f hatalar\u0131n\u0131 veya sunucu taraf\u0131 hatalar\u0131n\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmek \u00f6nemlidir.<\/p>\n<h3>Strapi&#8217;yi \u00d6zelle\u015ftirme ve Geni\u015fletme<\/h3>\n<p>Strapi&#8217;nin en g\u00fc\u00e7l\u00fc yanlar\u0131ndan biri, \u00e7ekirdek i\u015flevselli\u011fini kolayca geni\u015fletebilme ve \u00f6zelle\u015ftirebilme yetene\u011fidir.<\/p>\n<h4>Pluginler<\/h4>\n<p>Strapi, \u00e7e\u015fitli i\u015flevler eklemek i\u00e7in bir plugin ekosistemine sahiptir. Baz\u0131 \u00f6nemli plugin&#8217;ler:<\/p>\n<p>*   <strong>GraphQL:<\/strong> Yukar\u0131da bahsedildi\u011fi gibi, GraphQL API&#8217;si eklemek i\u00e7in.<br \/>\n*   <strong>Internationalization (i18n):<\/strong> \u0130\u00e7eriklerin birden fazla dilde y\u00f6netilmesini sa\u011flar.<br \/>\n*   <strong>Upload:<\/strong> Medya dosyalar\u0131n\u0131n y\u00fcklenmesini ve y\u00f6netimini sa\u011flar.<br \/>\n*   <strong>Documentation:<\/strong> API&#8217;nizin Swagger\/OpenAPI belgelerini otomatik olarak olu\u015fturur ve sunar.<\/p>\n<p>Plugin&#8217;leri <code>npm install <plugin-name><\/code> komutuyla kurduktan sonra Strapi sunucunuzu yeniden ba\u015flatman\u0131z yeterlidir.<\/p>\n<h4>Custom Controller&#8217;lar ve Servisler<\/h4>\n<p>Strapi, i\u00e7erik modelleri i\u00e7in otomatik olarak controller&#8217;lar ve servisler olu\u015fturur. Ancak, \u00f6zel i\u015f mant\u0131\u011f\u0131 eklemeniz veya varsay\u0131lan davran\u0131\u015flar\u0131 ge\u00e7ersiz k\u0131lman\u0131z gerekebilir.<\/p>\n<p>*   <strong>Servisler:<\/strong> \u0130\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir. Veritaban\u0131 i\u015flemleri, harici API \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k hesaplamalar gibi g\u00f6revleri servislerde tan\u0131mlayabilirsiniz.<br \/>\n    *   <code>src\/api\/<content-type>\/services\/<content-type>.js<\/code> dosyas\u0131nda varsay\u0131lan servisi bulabilirsiniz.<br \/>\n    *   \u00d6zel bir servis olu\u015fturmak i\u00e7in: <code>src\/api\/my-custom-api\/services\/my-custom-service.js<\/code> gibi bir yol izleyebilirsiniz.<br \/>\n*   <strong>Controller&#8217;lar:<\/strong> Gelen HTTP isteklerini i\u015fler ve servislerdeki i\u015f mant\u0131\u011f\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r.<br \/>\n    *   <code>src\/api\/<content-type>\/controllers\/<content-type>.js<\/code> dosyas\u0131nda varsay\u0131lan controller&#8217;\u0131 bulabilirsiniz.<br \/>\n    *   Varsay\u0131lan bir controller&#8217;\u0131 ge\u00e7ersiz k\u0131lmak i\u00e7in:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/api\/makale\/controllers\/makale.js\n        'use strict';\n\n        const { createCoreController } = require('@strapi\/strapi').factories;\n\n        module.exports = createCoreController('api::makale.makale', ({ strapi }) => ({\n          \/\/ Varsay\u0131lan find metodunu ge\u00e7ersiz k\u0131lma\n          async find(ctx) {\n            \/\/ \u00d6zel sorgu parametreleri veya i\u015f mant\u0131\u011f\u0131 ekle\n            const { data, meta } = await super.find(ctx);\n\n            \/\/ Gelen veriye \u00f6zel bir alan ekleme\n            const modifiedData = data.map(item => ({\n              ...item,\n              attributes: {\n                ...item.attributes,\n                ozelAlan: 'Bu \u00f6zel bir aland\u0131r.'\n              }\n            }));\n\n            return { data: modifiedData, meta };\n          },\n\n          \/\/ \u00d6zel bir endpoint olu\u015fturma\n          async customEndpoint(ctx) {\n            try {\n              const entries = await strapi.service('api::makale.makale').find({ filters: { baslik: 'Strapi' } });\n              ctx.body = entries;\n            } catch (err) {\n              ctx.body = err;\n            }\n          }\n        }));<\/code><\/pre>\n<p>    *   Yeni bir endpoint olu\u015fturdu\u011funuzda, bu endpoint i\u00e7in bir rota tan\u0131mlaman\u0131z gerekir. <code>src\/api\/<content-type>\/routes\/<content-type>.js<\/code> dosyas\u0131nda veya <code>src\/api\/my-custom-api\/routes\/my-custom-api.js<\/code> i\u00e7inde \u00f6zel bir rota tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/api\/makale\/routes\/makale.js\n        module.exports = {\n          routes: [\n            \/\/ ... mevcut rotalar ...\n            {\n              method: 'GET',\n              path: '\/makaleler\/custom',\n              handler: 'api::makale.makale.customEndpoint', \/\/ Controller'daki metodun ad\u0131\n              config: {\n                policies: [],\n                middlewares: [],\n              },\n            },\n          ],\n        };<\/code><\/pre>\n<h4>Middleware&#8217;ler<\/h4>\n<p>Middleware&#8217;ler, gelen istekleri i\u015flemek veya giden yan\u0131tlar\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Kimlik do\u011frulama, loglama, hata i\u015fleme veya veri d\u00f6n\u00fc\u015ft\u00fcrme gibi g\u00f6revler i\u00e7in idealdir. <code>src\/middlewares\/<\/code> klas\u00f6r\u00fcnde \u00f6zel middleware&#8217;ler olu\u015fturabilirsiniz.<\/p>\n<h4>Webhook&#8217;lar<\/h4>\n<p>Strapi, i\u00e7erik de\u011fi\u015fti\u011finde (olu\u015fturuldu\u011funda, g\u00fcncellendi\u011finde, silindi\u011finde veya yay\u0131nland\u0131\u011f\u0131nda) harici URL&#8217;lere HTTP istekleri (webhook&#8217;lar) g\u00f6nderebilir. Bu, frontend uygulaman\u0131z\u0131n otomatik olarak yeniden derlenmesi (CI\/CD entegrasyonu), bildirim g\u00f6nderme veya ba\u015fka bir servisi tetikleme gibi senaryolar i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Y\u00f6netim panelinde <code>Settings<\/code> -> <code>Webhooks<\/code> b\u00f6l\u00fcm\u00fcnden yap\u0131land\u0131rabilirsiniz.<\/p>\n<h3>Strapi ile Geli\u015ftirme \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Strapi ile API geli\u015ftirirken dikkat etmeniz gereken baz\u0131 ipu\u00e7lar\u0131 ve en iyi uygulamalar:<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>*   <strong>API Anahtarlar\u0131 (API Tokens):<\/strong> API&#8217;nize eri\u015fimi belirli uygulamalarla k\u0131s\u0131tlamak i\u00e7in API Anahtarlar\u0131 kullan\u0131n. Bu anahtarlar\u0131 belirli rollerle ve izinlerle ili\u015fkilendirebilirsiniz. <code>Settings<\/code> -> <code>API Tokens<\/code> b\u00f6l\u00fcm\u00fcnden y\u00f6netilebilir.<br \/>\n*   <strong>JWT Kimlik Do\u011frulama:<\/strong> Kullan\u0131c\u0131lar\u0131n giri\u015f yapmas\u0131n\u0131 ve token almas\u0131n\u0131 sa\u011flayarak kimli\u011fi do\u011frulanm\u0131\u015f isteklere eri\u015fim sa\u011flay\u0131n. Strapi&#8217;nin varsay\u0131lan kullan\u0131c\u0131 kimlik do\u011frulama sistemi JWT kullan\u0131r.<br \/>\n*   <strong>CORS Politikalar\u0131:<\/strong> \u00dcretim ortam\u0131nda, <code>config\/middlewares.js<\/code> dosyas\u0131ndaki CORS ayarlar\u0131n\u0131 yaln\u0131zca g\u00fcvenilir domain&#8217;lerle k\u0131s\u0131tlay\u0131n. <code>origin: ['https:\/\/your-frontend.com']<\/code> gibi.<br \/>\n*   <strong>Rate Limiting:<\/strong> API&#8217;nize gelen istek say\u0131s\u0131n\u0131 s\u0131n\u0131rlayarak DDoS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flay\u0131n. \u00d6zel bir middleware veya proxy sunucu (Nginx gibi) ile uygulanabilir.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> Hassas bilgileri (veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131) do\u011frudan kod i\u00e7inde saklamak yerine <code>.env<\/code> dosyas\u0131 ve ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netin.<\/p>\n<h4>Performans<\/h4>\n<p>*   <strong>Veritaban\u0131 Optimizasyonu:<\/strong> B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken veritaban\u0131 sorgular\u0131n\u0131z\u0131n performans\u0131n\u0131 izleyin. Gerekirse indeksler ekleyin.<br \/>\n*   <strong>\u00d6nbellekleme (Caching):<\/strong> S\u0131k eri\u015filen ancak nadiren de\u011fi\u015fen veriler i\u00e7in \u00f6nbellekleme stratejileri uygulay\u0131n. Bir ters proxy (Nginx, Varnish) veya bir \u00f6nbellekleme plugin&#8217;i kullan\u0131labilir.<br \/>\n*   <strong>Populate Kullan\u0131m\u0131:<\/strong> <code>populate<\/code> parametresini yaln\u0131zca ger\u00e7ekten ihtiyac\u0131n\u0131z olan ili\u015fkili verileri \u00e7ekmek i\u00e7in kullan\u0131n. \u00c7ok fazla i\u00e7 i\u00e7e populate, performans sorunlar\u0131na yol a\u00e7abilir.<br \/>\n*   <strong>Sorgu Optimizasyonu:<\/strong> Frontend&#8217;den yap\u0131lan API isteklerinde <code>filters<\/code>, <code>sort<\/code>, <code>pagination<\/code> gibi parametreleri ak\u0131ll\u0131ca kullanarak sadece gerekli veriyi \u00e7ekin.<\/p>\n<h4>Da\u011f\u0131t\u0131m (Deployment)<\/h4>\n<p>*   <strong>\u00dcretim Ortam\u0131 Yap\u0131land\u0131rmas\u0131:<\/strong> <code>config\/env\/production\/database.js<\/code> gibi ortama \u00f6zel yap\u0131land\u0131rma dosyalar\u0131 kullanarak \u00fcretim veritaban\u0131 ve di\u011fer ayarlar\u0131n\u0131z\u0131 tan\u0131mlay\u0131n.<br \/>\n*   <strong>pm2 Kullan\u0131m\u0131:<\/strong> Node.js uygulamalar\u0131n\u0131 \u00fcretimde s\u00fcrekli \u00e7al\u0131\u015ft\u0131rmak ve denetlemek i\u00e7in pm2 gibi bir s\u00fcre\u00e7 y\u00f6neticisi kullan\u0131n.<br \/>\n*   <strong>Docker:<\/strong> Strapi uygulaman\u0131z\u0131 Docker konteynerleri i\u00e7inde da\u011f\u0131tmak, ta\u015f\u0131nabilirlik ve izolasyon sa\u011flar.<br \/>\n*   <strong>Bulut Sa\u011flay\u0131c\u0131lar\u0131:<\/strong> Heroku, AWS, DigitalOcean, Google Cloud gibi bulut sa\u011flay\u0131c\u0131lar\u0131nda Strapi&#8217;yi kolayca da\u011f\u0131tabilirsiniz. Strapi&#8217;nin kendi da\u011f\u0131t\u0131m k\u0131lavuzlar\u0131 mevcuttur.<\/p>\n<h4>Veri Y\u00f6netimi<\/h4>\n<p>*   <strong>Veritaban\u0131 Yedekleme:<\/strong> D\u00fczenli olarak veritaban\u0131 yedeklemeleri al\u0131n.<br \/>\n*   <strong>Veri G\u00f6\u00e7\u00fc (Migrations):<\/strong> \u0130\u00e7erik modelinizde b\u00fcy\u00fck de\u011fi\u015fiklikler yaparken, mevcut verilerinizi yeni \u015femaya ta\u015f\u0131mak i\u00e7in veri g\u00f6\u00e7\u00fc stratejileri planlay\u0131n. Strapi&#8217;nin yerle\u015fik bir migrasyon arac\u0131 yoktur, ancak \u00f6zel komut dosyalar\u0131 veya \u00fc\u00e7\u00fcnc\u00fc taraf ara\u00e7lar kullan\u0131labilir.<br \/>\n*   <strong>Versiyon Kontrol\u00fc:<\/strong> Strapi projenizin kodunu Git gibi bir versiyon kontrol sistemiyle y\u00f6netin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Strapi, modern API geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131ran ve i\u00e7erik y\u00f6netimini basitle\u015ftiren g\u00fc\u00e7l\u00fc ve esnek bir headless CMS \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. A\u00e7\u0131k kaynak kodlu yap\u0131s\u0131, geli\u015ftirici dostu aray\u00fcz\u00fc, geni\u015fletilebilirlik se\u00e7enekleri ve platform ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 sayesinde, geli\u015ftiricilere projeleri i\u00e7in sa\u011flam bir temel sunar. Bu makalede, Strapi kurulumundan i\u00e7erik modeli olu\u015fturmaya, API izinlerini yap\u0131land\u0131rmaktan API&#8217;yi t\u00fcketmeye ve ileri d\u00fczey \u00f6zelle\u015ftirmelere kadar bir\u00e7ok temel konuyu ele ald\u0131k.<\/p>\n<p>Strapi ile bir API olu\u015fturmak, geleneksel y\u00f6ntemlere g\u00f6re \u00e7ok daha h\u0131zl\u0131 ve verimlidir. Otomatik olarak olu\u015fturulan REST ve GraphQL endpoint&#8217;leri, g\u00fc\u00e7l\u00fc sorgu yetenekleri ve kolay \u00f6zelle\u015ftirme imkanlar\u0131 sayesinde, geli\u015ftiriciler zamanlar\u0131n\u0131 \u00e7ekirdek i\u015f mant\u0131\u011f\u0131na ve kullan\u0131c\u0131 deneyimine odaklayabilirler. \u0130ster k\u00fc\u00e7\u00fck bir blog, ister b\u00fcy\u00fck \u00f6l\u00e7ekli bir kurumsal uygulama geli\u015ftiriyor olun, Strapi g\u00fc\u00e7l\u00fc, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir API altyap\u0131s\u0131 sa\u011flamak i\u00e7in harika bir se\u00e7imdir.<\/p>\n<p>Strapi&#8217;nin sundu\u011fu bu avantajlar\u0131 ke\u015ffetmek ve projelerinizde kullanmak i\u00e7in daha fazla beklemeyin. Kendi Strapi API&#8217;nizi olu\u015fturmaya ba\u015flay\u0131n ve modern web d\u00fcnyas\u0131n\u0131n dinamik i\u00e7erik ihtiya\u00e7lar\u0131n\u0131 kolayca kar\u015f\u0131lay\u0131n!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?\nModern web ve mobil uygulamalar, genellikle frontend ve backend katmanlar\u0131 aras\u0131nda veri al\u0131\u015fver","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-38733","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>Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? - 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\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? Modern web ve mobil uygulamalar, genellikle frontend ve backend katmanlar\u0131 aras\u0131nda veri al\u0131\u015fver\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-06T10:40:48+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2026-02-06T10:40:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\"},\"wordCount\":2993,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\",\"name\":\"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-06T10:40:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?\"}]},{\"@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":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? - 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\/strapi-ile-guclu-bir-api-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?","og_description":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? Modern web ve mobil uygulamalar, genellikle frontend ve backend katmanlar\u0131 aras\u0131nda veri al\u0131\u015fver","og_url":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-06T10:40:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?","datePublished":"2026-02-06T10:40:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/"},"wordCount":2993,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/","name":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-06T10:40:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/strapi-ile-guclu-bir-api-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Strapi ile G\u00fc\u00e7l\u00fc Bir API Nas\u0131l Olu\u015fturulur?"}]},{"@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\/38733","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=38733"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38733\/revisions"}],"predecessor-version":[{"id":38734,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38733\/revisions\/38734"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}