{"id":976,"date":"2025-05-10T10:21:36","date_gmt":"2025-05-10T10:21:36","guid":{"rendered":"https:\/\/serhatdiker.com\/?p=976"},"modified":"2025-05-20T12:30:05","modified_gmt":"2025-05-20T12:30:05","slug":"modern-web-api-mimarileri-rest-graphql-grpc-ve-saglam-altyapi-tasarimi","status":"publish","type":"post","link":"https:\/\/serhatdiker.com\/index.php\/2025\/05\/10\/modern-web-api-mimarileri-rest-graphql-grpc-ve-saglam-altyapi-tasarimi\/","title":{"rendered":"Modern Web API Mimarileri: REST, GraphQL, gRPC ve Sa\u011flam Altyap\u0131 Tasar\u0131m\u0131"},"content":{"rendered":"\n<p><strong>Giri\u015f<\/strong><\/p>\n\n\n\n<p>Y\u0131l 2025. H\u00e2l\u00e2 REST API geli\u015ftiriyor ve mevcut sistemlerdeki eski servisleri buna d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Ama bu, do\u011fru se\u00e7im yapt\u0131\u011f\u0131m\u0131z anlam\u0131na gelmiyor olabilir. Web API mimarileri son 10 y\u0131lda radikal bir de\u011fi\u015fim ge\u00e7irdi. REST h\u00e2l\u00e2 hayatta, evet. Ama art\u0131k \u00f6l\u00e7eklenebilirlik, esneklik, g\u00fcvenlik, h\u0131z ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan ihtiya\u00e7lar\u0131m\u0131z de\u011fi\u015fti.<\/p>\n\n\n\n<p>Bu yaz\u0131da:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>REST, GraphQL ve gRPC mimarilerinin g\u00fc\u00e7l\u00fc\/zay\u0131f y\u00f6nlerini k\u0131yaslayaca\u011f\u0131z,<\/li>\n\n\n\n<li>API altyap\u0131s\u0131n\u0131 ta\u015f\u0131yan temel yap\u0131ta\u015flar\u0131n\u0131 inceleyece\u011fiz: API Gateway, OAuth2, Rate Limiting, G\u00f6zlemleme.<\/li>\n<\/ul>\n\n\n\n<p>Ama\u00e7: Mimariden \u00f6nce senaryoyu anlamak, do\u011fru API yakla\u015f\u0131m\u0131n\u0131 do\u011fru sistemlerde kullanmak.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>1. REST API \u2013 H\u00e2l\u00e2 Varsay\u0131lan, Ama Neden?<\/strong><\/p>\n\n\n\n<p><strong>Ne \u0130\u015fe Yarar?<\/strong><\/p>\n\n\n\n<p>REST (Representational State Transfer), HTTP protokol\u00fc \u00fczerinde \u00e7al\u0131\u015fan, URI tabanl\u0131 kaynak eri\u015fimi sa\u011flayan ve JSON ile ileti\u015fim kuran sistemlerin omurgas\u0131n\u0131 olu\u015fturur.<\/p>\n\n\n\n<p><strong>Avantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CRUD operasyonlar\u0131 i\u00e7in idealdir<\/li>\n\n\n\n<li>Her frontend kolayl\u0131kla entegre olur<\/li>\n\n\n\n<li>HTTP\u2019ye tam uyumludur (GET, POST, PUT, DELETE)<\/li>\n<\/ul>\n\n\n\n<p><strong>Dezavantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Overfetching\/Underfetching:<\/strong> Gereksiz veri ta\u015f\u0131nabilir<\/li>\n\n\n\n<li><strong>Versionlama karma\u015fas\u0131:<\/strong> \/v1\/users, \/v2\/users gibi URI \u00e7\u00f6z\u00fcmleri<\/li>\n\n\n\n<li><strong>Veri esnekli\u011fi s\u0131n\u0131rl\u0131:<\/strong> Sabit endpoint yap\u0131lar\u0131<\/li>\n<\/ul>\n\n\n\n<p><strong>Ne Zaman Kullan\u0131l\u0131r?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Basit CRUD uygulamalar\u0131<\/li>\n\n\n\n<li>Mobil API&#8217;ler<\/li>\n\n\n\n<li>Tek sorumlulu\u011fu olan mikroservisler<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>2. GraphQL \u2013 Kontrol\u00fc \u0130stemciye Veren G\u00fc\u00e7l\u00fc Ama Zorlay\u0131c\u0131 Yap\u0131<\/strong><\/p>\n\n\n\n<p><strong>Ne \u0130\u015fe Yarar?<\/strong><\/p>\n\n\n\n<p>\u0130stemcinin yaln\u0131zca ihtiyac\u0131 olan veriyi sorgulayabildi\u011fi, tip g\u00fcvenli ve tek endpoint ile \u00e7al\u0131\u015fan bir sorgu dili sunar.<\/p>\n\n\n\n<p><strong>Avantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Overfetching yok, sadece ihtiya\u00e7 olan veri al\u0131n\u0131r<\/li>\n\n\n\n<li>Frontend, veri yap\u0131s\u0131n\u0131 belirleyebilir<\/li>\n\n\n\n<li>Otomatik \u015fema dok\u00fcmantasyonu (Playground, Voyager)<\/li>\n<\/ul>\n\n\n\n<p><strong>Dezavantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sunucu taraf\u0131nda caching zordur<\/li>\n\n\n\n<li>Field-level authorization karma\u015f\u0131kla\u015f\u0131r<\/li>\n\n\n\n<li>Resolver mimarisi k\u00f6t\u00fc tasarlan\u0131rsa N+1 sorgu problemi ya\u015fanabilir<\/li>\n\n\n\n<li>HTTP status kodlar\u0131n\u0131n yeri yerine response i\u00e7inde hata objesi gelir<\/li>\n<\/ul>\n\n\n\n<p><strong>Ne Zaman Kullan\u0131l\u0131r?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modern frontend mimarilerinde<\/li>\n\n\n\n<li>Mobilde veri trafi\u011fini azaltmak gerekti\u011finde<\/li>\n\n\n\n<li>B\u00fcy\u00fck veri modellerinde esneklik gerekiyorsa<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>3. gRPC \u2013 Mikroservislerin Sessiz Kahraman\u0131<\/strong><\/p>\n\n\n\n<p><strong>Ne \u0130\u015fe Yarar?<\/strong><\/p>\n\n\n\n<p>gRPC, Google taraf\u0131ndan geli\u015ftirilen, Protobuf format\u0131nda veri ta\u015f\u0131yan, HTTP\/2 tabanl\u0131 bir RPC protokol\u00fcd\u00fcr. \u00d6zellikle mikroservis mimarilerinde servisler aras\u0131 h\u0131zl\u0131 ve d\u00fc\u015f\u00fck gecikmeli ileti\u015fim i\u00e7in bi\u00e7ilmi\u015f kaftand\u0131r.<\/p>\n\n\n\n<p><strong>Avantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Performans y\u00fcksek, payload k\u00fc\u00e7\u00fck. Protobuf metin de\u011fil, binarydir.<\/li>\n\n\n\n<li>Streaming deste\u011fi var. Hem client-to-server hem de bidirectional streaming m\u00fcmk\u00fcn.<\/li>\n\n\n\n<li>Dil ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131: C#, Go, Java, Rust&#8230; Hepsiyle uyumlu.<\/li>\n<\/ul>\n\n\n\n<p><strong>Dezavantajlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Web taray\u0131c\u0131lar do\u011frudan desteklemez. Bu nedenle gRPC-Web gibi proxy \u00e7\u00f6z\u00fcmler gerekir.<\/li>\n\n\n\n<li>Debugging zordur. JSON de\u011fil, okunabilirlik yok.<\/li>\n\n\n\n<li>\u00d6\u011frenme e\u011frisi dik. REST kadar yayg\u0131n de\u011fil, al\u0131\u015fkanl\u0131klar farkl\u0131.<\/li>\n<\/ul>\n\n\n\n<p><strong>Ne Zaman Kullan\u0131l\u0131r?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mikroservis-to-mikroservis ileti\u015fiminde<\/li>\n\n\n\n<li>Ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131nda (streaming)<\/li>\n\n\n\n<li>Performans\u0131n kritik oldu\u011fu sistemlerde<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>4. API Altyap\u0131s\u0131 Nas\u0131l Sa\u011flam Kurulur?<\/strong><\/p>\n\n\n\n<p><strong>4.1 API Gateway: Modern Servis Mimarilerinin Omurgas\u0131<\/strong><\/p>\n\n\n\n<p><strong>Ne \u0130\u015fe Yarar?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Routing (istek y\u00f6nlendirme)<\/li>\n\n\n\n<li>Authentication &amp; Authorization (JWT, API Key, OAuth2)<\/li>\n\n\n\n<li>Rate Limiting<\/li>\n\n\n\n<li>Response Caching<\/li>\n\n\n\n<li>Loglama ve monitoring entegrasyonu<\/li>\n\n\n\n<li>SSL Termination ve CORS y\u00f6netimi<\/li>\n\n\n\n<li>Request\/Response transformasyonu ve aggregasyonu<\/li>\n<\/ul>\n\n\n\n<p><strong>Pop\u00fcler Gateway \u00c7\u00f6z\u00fcmleri<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u00dcr\u00fcn<\/strong><\/td><td><strong>A\u00e7\u0131k Kaynak<\/strong><\/td><td><strong>Cloud Uyumlu<\/strong><\/td><td><strong>Eklenti Sistemi<\/strong><\/td><td><strong>Geli\u015ftirici Deste\u011fi<\/strong><\/td><\/tr><tr><td>Kong<\/td><td>\u2705<\/td><td>\u2705<\/td><td>Lua tabanl\u0131 g\u00fc\u00e7l\u00fc<\/td><td>\u00c7ok aktif<\/td><\/tr><tr><td>Tyk<\/td><td>\u2705<\/td><td>\u2705<\/td><td>JS middleware<\/td><td>Orta d\u00fczey<\/td><\/tr><tr><td>AWS API Gateway<\/td><td>\u274c<\/td><td>\u2705<\/td><td>Native AWS<\/td><td>Y\u00fcksek<\/td><\/tr><tr><td>Azure API Mgmt<\/td><td>\u274c<\/td><td>\u2705<\/td><td>Azure Function entegrasyonu<\/td><td>Y\u00fcksek<\/td><\/tr><tr><td>Traefik Gateway<\/td><td>\u2705<\/td><td>\u2705<\/td><td>Plugin\u2019li<\/td><td>Go tabanl\u0131 \u00e7evik<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Ne Zaman Gerekli?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mikroservis say\u0131n\u0131z ikiyi ge\u00e7tiyse<\/li>\n\n\n\n<li>Farkl\u0131 istemci tipleri varsa (web, mobil, IoT)<\/li>\n\n\n\n<li>SSO, OAuth2 gibi entegrasyonlar d\u00fc\u015f\u00fcn\u00fcl\u00fcyorsa<\/li>\n\n\n\n<li>Rate limiting ya da SLA gibi servis kalitesi ihtiyac\u0131 varsa<\/li>\n<\/ul>\n\n\n\n<p>Gateway koymadan geli\u015ftirilen sistemler k\u0131sa vadede h\u0131zl\u0131 ba\u015flasa da orta vadede g\u00fcvenlik, loglama, eri\u015fim kontrol\u00fc ve versiyonlama konular\u0131nda i\u00e7inden \u00e7\u0131k\u0131lamaz hale gelir.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>4.2 OAuth2 ve Token Y\u00f6netimi: Kimlik Do\u011frulaman\u0131n Omurgas\u0131<\/strong><\/p>\n\n\n\n<p><strong>Ne \u0130\u015fe Yarar?<\/strong><\/p>\n\n\n\n<p>Kullan\u0131c\u0131n\u0131n \u015fifresini if\u015fa etmeden sistem \u00fczerinde g\u00fcvenli i\u015flem yapmas\u0131na izin verir. Genellikle JWT ile birlikte \u00e7al\u0131\u015f\u0131r.<\/p>\n\n\n\n<p><strong>Senaryolar<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mobil uygulama API\u2019ye eri\u015fmek istiyor ama \u015fifre bilgisi payla\u015f\u0131lmaz<\/li>\n\n\n\n<li>3. parti bir servis, kullan\u0131c\u0131 ad\u0131na i\u015flem yapacak<\/li>\n\n\n\n<li>Kullan\u0131c\u0131y\u0131 frontend\u2019de login ettin, backend\u2019de do\u011frulamak istiyorsun<\/li>\n<\/ul>\n\n\n\n<p><strong>Token T\u00fcrleri<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Access Token:<\/strong> K\u0131sa \u00f6m\u00fcrl\u00fc, i\u015flem yetkisi sa\u011flar<\/li>\n\n\n\n<li><strong>Refresh Token:<\/strong> Yeni access token almak i\u00e7in kullan\u0131l\u0131r<\/li>\n<\/ul>\n\n\n\n<p><strong>Refresh Token Ak\u0131\u015f\u0131<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Kullan\u0131c\u0131 login olur, access + refresh token al\u0131r<\/li>\n\n\n\n<li>Access token s\u00fcresi biter<\/li>\n\n\n\n<li>Refresh token ile yeni access token al\u0131n\u0131r<\/li>\n\n\n\n<li>Refresh token s\u00fcresi de biterse \u2192 yeniden login gerekir<\/li>\n<\/ol>\n\n\n\n<p><strong>G\u00fcvenlik Notlar\u0131<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Access token k\u0131sa s\u00fcreli tutulmal\u0131<\/li>\n\n\n\n<li>Refresh token client taraf\u0131nda secure storage (mobilde) veya HttpOnly + Secure cookie ile saklanmal\u0131<\/li>\n\n\n\n<li>JWT imzalanmal\u0131 (RS256 \u00f6nerilir)<\/li>\n\n\n\n<li>Token iptal listesi (revocation) gerekir. JWT tek ba\u015f\u0131na merkezi iptal sunmaz.<\/li>\n<\/ul>\n\n\n\n<p><strong>S\u0131k Yap\u0131lan Hatalar<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Hata<\/td><td>A\u00e7\u0131klama<\/td><\/tr><tr><td>Access token\u2019a 1 hafta \u00f6m\u00fcr vermek<\/td><td>Token \u00e7al\u0131n\u0131rsa sistem 1 hafta boyunca a\u00e7\u0131kt\u0131r<\/td><\/tr><tr><td>Refresh token&#8217;\u0131 localStorage&#8217;da tutmak<\/td><td>Taray\u0131c\u0131dan eri\u015filebilir, XSS ile \u00e7al\u0131nabilir<\/td><\/tr><tr><td>JWT i\u00e7eri\u011fini fazla doldurmak<\/td><td>Payload b\u00fcy\u00fcr, a\u011f trafi\u011fi artar, saklama zorla\u015f\u0131r<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>4.3 G\u00f6zlemleme ve Loglama: \u00d6l\u00e7emedi\u011fini Y\u00f6netemezsin<\/strong><\/p>\n\n\n\n<p><strong>Neden Gereklidir?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Performans d\u00fc\u015f\u00fc\u015flerini anlamak<\/li>\n\n\n\n<li>Root cause analizi yapmak<\/li>\n\n\n\n<li>Ger\u00e7ek kullan\u0131c\u0131 deneyimini takip etmek<\/li>\n<\/ul>\n\n\n\n<p><strong>Bile\u015fenler<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OpenTelemetry:<\/strong> Logs, Metrics, Traces toplar<\/li>\n\n\n\n<li><strong>Jaeger:<\/strong> Da\u011f\u0131t\u0131k izleme ve trace analizi sa\u011flar<\/li>\n\n\n\n<li><strong>Prometheus:<\/strong> Zaman serisi veri toplar<\/li>\n\n\n\n<li><strong>Grafana:<\/strong> Metric\u2019leri g\u00f6rselle\u015ftirir<\/li>\n<\/ul>\n\n\n\n<p><strong>Loglanacak Veri T\u00fcrleri<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>T\u00fcr<\/td><td>A\u00e7\u0131klama<\/td><\/tr><tr><td>Log<\/td><td>\u0130\u015f ak\u0131\u015f\u0131, hata, uyar\u0131lar (Structured JSON)<\/td><\/tr><tr><td>Metric<\/td><td>CPU, bellek, istek s\u00fcresi, hata oran\u0131<\/td><\/tr><tr><td>Trace<\/td><td>Servisler aras\u0131 \u00e7a\u011fr\u0131 zinciri<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Entegrasyon Ak\u0131\u015f\u0131<\/strong><\/p>\n\n\n\n<p>Kod \u2192 OpenTelemetry Agent \u2192<\/p>\n\n\n\n<p>\u2192 Jaeger (trace) + Prometheus (metric) \u2192<\/p>\n\n\n\n<p>\u2192 Grafana (dashboard)<\/p>\n\n\n\n<p>&#8220;Log yoksa hata yok&#8221; devri kapand\u0131. Art\u0131k &#8220;log varsa anlam var&#8221; devri ba\u015flad\u0131.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Sonu\u00e7: Do\u011fru Ara\u00e7, Do\u011fru Problem i\u00e7in<\/strong><\/p>\n\n\n\n<p>Hi\u00e7bir mimari di\u011ferini tamamen ortadan kald\u0131rmad\u0131. REST h\u00e2l\u00e2 varsay\u0131lan. GraphQL baz\u0131 alanlarda nefes ald\u0131r\u0131yor. gRPC ise sistem i\u00e7i ileti\u015fimin yeni standard\u0131 olmaya aday.<\/p>\n\n\n\n<p>Sistem tasarlarken sorulmas\u0131 gereken as\u0131l sorular \u015funlar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API yaln\u0131zca veri mi sunacak, yoksa davran\u0131\u015f da m\u0131 ta\u015f\u0131yacak?<\/li>\n\n\n\n<li>Hedef istemciler kimler? (web, mobil, servis)<\/li>\n\n\n\n<li>Tak\u0131m bu teknolojiyi s\u00fcrd\u00fcrebilir mi?<\/li>\n\n\n\n<li>G\u00f6zlemleme, g\u00fcvenlik, \u00f6l\u00e7eklenebilirlik i\u00e7in ne kadar yat\u0131r\u0131m yap\u0131lacak?<\/li>\n<\/ul>\n\n\n\n<p>&#8220;Login olduktan sonra her \u015fey bitmiyor. As\u0131l oyun, mimariyi ya\u015fatmakla ba\u015fl\u0131yor.&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1366\" height=\"756\" src=\"https:\/\/serhatdiker.com\/wp-content\/uploads\/2025\/05\/Web-API-Mimarisi-ve-Araclari.png\" alt=\"\" class=\"wp-image-977\" srcset=\"https:\/\/serhatdiker.com\/wp-content\/uploads\/2025\/05\/Web-API-Mimarisi-ve-Araclari.png 1366w, https:\/\/serhatdiker.com\/wp-content\/uploads\/2025\/05\/Web-API-Mimarisi-ve-Araclari-300x166.png 300w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Giri\u015f Y\u0131l 2025. H\u00e2l\u00e2 REST API geli\u015ftiriyor ve mevcut sistemlerdeki eski servisleri buna d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Ama bu, do\u011fru se\u00e7im yapt\u0131\u011f\u0131m\u0131z anlam\u0131na gelmiyor olabilir. Web API mimarileri son&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":977,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[125,110,120,132,128,123,130,124,122,131,127,121,116,111,117,109,114,126,108,119,113,118,115,107,112,129],"class_list":["post-976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-trends","tag-api-debugging","tag-api-gateway","tag-api-guvenligi","tag-api-logging","tag-api-monitoring","tag-api-performansi","tag-api-rate-limiting","tag-api-versiyonlama","tag-api-yonetimi","tag-backend-mimarisi","tag-dagitik-sistemler","tag-grafana","tag-graphql","tag-grpc","tag-jaeger","tag-jwt","tag-microservices","tag-modern-yazilim-mimarisi","tag-oauth2","tag-observability","tag-opentelemetry","tag-prometheus","tag-refresh-token","tag-rest-api","tag-web-api-mimarisi","tag-web-servisler"],"_links":{"self":[{"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/posts\/976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/comments?post=976"}],"version-history":[{"count":1,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/posts\/976\/revisions"}],"predecessor-version":[{"id":978,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/posts\/976\/revisions\/978"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/media\/977"}],"wp:attachment":[{"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/media?parent=976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/categories?post=976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/serhatdiker.com\/index.php\/wp-json\/wp\/v2\/tags?post=976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}