{"id":35263,"date":"2025-11-27T15:41:28","date_gmt":"2025-11-27T12:41:28","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35263"},"modified":"2025-11-27T15:41:28","modified_gmt":"2025-11-27T12:41:28","slug":"retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/","title":{"rendered":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri"},"content":{"rendered":"<p><body><\/p>\n<h2>Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri<\/h2>\n<p>Android uygulamalar\u0131 geli\u015ftirirken, uzak sunucularla ileti\u015fim kurmak ve API&#8217;lerden veri \u00e7ekmek temel ihtiya\u00e7lardan biridir. Bu s\u00fcre\u00e7, a\u011f istekleri g\u00f6ndermeyi, al\u0131nan verileri i\u015flemeyi ve kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6stermeyi i\u00e7erir. Android ekosisteminde a\u011f i\u015flemlerini kolayla\u015ft\u0131ran bir\u00e7ok k\u00fct\u00fcphane bulunsa da, Retrofit bu alanda en pop\u00fcler ve g\u00fc\u00e7l\u00fc se\u00e7eneklerden biridir. Square taraf\u0131ndan geli\u015ftirilen Retrofit, RESTful API&#8217;lerle etkile\u015fimi type-safe bir \u015fekilde ve minimal kodla yapman\u0131z\u0131 sa\u011flar. Bu rehberde, Retroft&#8217;in temel kullan\u0131m\u0131n\u0131, proje kurulumundan veri \u00e7ekmeye kadar ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Retrofit Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>Retrofit, Android ve Java uygulamalar\u0131 i\u00e7in tasarlanm\u0131\u015f, HTTP tabanl\u0131 API&#8217;leri type-safe bir \u015fekilde kullanmam\u0131z\u0131 sa\u011flayan bir REST istemci k\u00fct\u00fcphanesidir. Geli\u015ftiricilerin, API endpoint&#8217;lerini Java\/Kotlin aray\u00fczleri olarak tan\u0131mlamas\u0131na olanak tan\u0131r ve bu aray\u00fczleri kullanarak otomatik olarak HTTP istekleri olu\u015fturur.<\/p>\n<p>Retrofit kullanman\u0131n ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Type-Safety:<\/strong> \u0130stek ve yan\u0131t verileri i\u00e7in Java\/Kotlin s\u0131n\u0131flar\u0131 tan\u0131mlars\u0131n\u0131z, bu da derleme zaman\u0131 hatalar\u0131n\u0131 azalt\u0131r ve kod okunabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Kolay Kullan\u0131m:<\/strong> Annotation&#8217;lar (<code>@GET<\/code>, <code>@POST<\/code>, <code>@Body<\/code> vb.) sayesinde API endpoint&#8217;lerini tan\u0131mlamak olduk\u00e7a basittir.<br \/>\n*   <strong>Esneklik:<\/strong> JSON (Gson, Moshi), XML (SimpleXML) ve di\u011fer veri formatlar\u0131 i\u00e7in d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fclerle (Converter) kolayca entegre olur.<br \/>\n*   <strong>Asenkron \u0130\u015flemler:<\/strong> \u0130stekleri ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (main thread) bloke etmeden asenkron olarak yapmay\u0131 destekler.<br \/>\n*   <strong>Geni\u015fletilebilirlik:<\/strong> OkHttp ile entegre \u00e7al\u0131\u015f\u0131r ve Interceptor&#8217;lar arac\u0131l\u0131\u011f\u0131yla istek\/yan\u0131t s\u00fcre\u00e7lerine m\u00fcdahale etme imkan\u0131 sunar (\u00f6rne\u011fin, loglama, kimlik do\u011frulama).<br \/>\n*   <strong>Coroutines\/RxJava Deste\u011fi:<\/strong> Modern Android geli\u015ftirme yakla\u015f\u0131mlar\u0131 olan Kotlin Coroutines ve RxJava ile sorunsuz entegrasyon i\u00e7in Call Adapter&#8217;lar sunar.<\/p>\n<p>Bu rehberde, basit bir &#8220;Post&#8221; listesini JSONPlaceholder API&#8217;sinden \u00e7ekip g\u00f6sterecek bir Android uygulamas\u0131 geli\u015ftirece\u011fiz.<\/p>\n<h3>Proje Kurulumu ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Yeni bir Android Studio projesi olu\u015fturarak ba\u015flayal\u0131m. Projeyi olu\u015fturduktan sonra, Retrofit ve ilgili ba\u011f\u0131ml\u0131l\u0131klar\u0131 projenize eklemeniz gerekmektedir. <code>app\/build.gradle<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve <code>dependencies<\/code> blo\u011funa a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    \/\/ Retrofit\n    implementation 'com.squareup.retrofit2:retrofit:2.9.0'\n    \/\/ JSON verilerini Java\/Kotlin objelerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in Gson Converter\n    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'\n    \/\/ (Opsiyonel) A\u011f isteklerini loglamak i\u00e7in OkHttp Logging Interceptor\n    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'\n\n    \/\/ Kotlin Coroutines deste\u011fi i\u00e7in (E\u011fer kullanacaksan\u0131z)\n    \/\/ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'\n    \/\/ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2'\n    \/\/ Retrofit Call Adapter for Coroutines\n    \/\/ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'\n    \/\/ Bu rehberde basit Call<T> kullanaca\u011f\u0131z, Coroutines entegrasyonu ayr\u0131 bir konu.\n}<\/code><\/pre>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra, projenizi senkronize etmeyi unutmay\u0131n (Sync Project with Gradle Files).<\/p>\n<p>Ayr\u0131ca, uygulaman\u0131z\u0131n internete eri\u015febilmesi i\u00e7in <code>AndroidManifest.xml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki izni eklemeniz gerekmektedir:<\/p>\n<pre><code class=\"language-xml\"><manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    package=\"com.example.myretrofitapp\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" \/>\n\n    <application\n        ...\n    <\/application>\n<\/manifest><\/code><\/pre>\n<p>Bu ad\u0131mlarla projemiz Retrofit kullanmaya haz\u0131r hale geldi.<\/p>\n<h3>API Aray\u00fcz\u00fc ve Veri Modelleri<\/h3>\n<p>Retrofit ile \u00e7al\u0131\u015f\u0131rken, API&#8217;den alaca\u011f\u0131n\u0131z verilerin yap\u0131s\u0131n\u0131 temsil eden veri modelleri (POJO &#8211; Plain Old Java Object veya Kotlin data class) olu\u015fturman\u0131z ve API&#8217;nin endpoint&#8217;lerini tan\u0131mlayan bir aray\u00fcz yazman\u0131z gerekir.<\/p>\n<h4>Veri Modelleri (Data Models)<\/h4>\n<p>JSONPlaceholder API&#8217;sinden <code>\/posts<\/code> endpoint&#8217;ine bir istek yapt\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki gibi bir JSON dizisi d\u00f6ner:<\/p>\n<pre><code class=\"language-json\">[\n  {\n    \"userId\": 1,\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"body\": \"quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto\"\n  },\n  \/\/ ... di\u011fer postlar\n]<\/code><\/pre>\n<p>Bu yap\u0131y\u0131 temsil eden bir Kotlin data class&#8217;\u0131 olu\u015ftural\u0131m. <code>app\/src\/main\/java\/your_package_name\/model\/Post.kt<\/code> dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-kotlin\">package com.example.myretrofitapp.model\n\nimport com.google.gson.annotations.SerializedName\n\ndata class Post(\n    @SerializedName(\"userId\")\n    val userId: Int,\n    @SerializedName(\"id\")\n    val id: Int,\n    @SerializedName(\"title\")\n    val title: String,\n    @SerializedName(\"body\")\n    val body: String\n)<\/code><\/pre>\n<p><code>@SerializedName<\/code> annotation&#8217;\u0131, JSON anahtar\u0131 ile Kotlin s\u0131n\u0131f\u0131ndaki de\u011fi\u015fken ad\u0131 farkl\u0131 oldu\u011funda kullan\u0131l\u0131r. Bu \u00f6rnekte ayn\u0131 olsa da, iyi bir pratik olarak eklemek faydal\u0131d\u0131r.<\/p>\n<h4>API Aray\u00fcz\u00fc (API Interface)<\/h4>\n<p>\u015eimdi API endpoint&#8217;imizi tan\u0131mlayacak bir Kotlin aray\u00fcz\u00fc olu\u015ftural\u0131m. Bu aray\u00fcz, Retrofit&#8217;in HTTP metodlar\u0131n\u0131 (GET, POST, PUT, DELETE) ve URL path&#8217;lerini anlamas\u0131n\u0131 sa\u011flar. <code>app\/src\/main\/java\/your_package_name\/api\/ApiService.kt<\/code> dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-kotlin\">package com.example.myretrofitapp.api\n\nimport com.example.myretrofitapp.model.Post\nimport retrofit2.Call\nimport retrofit2.http.GET\n\ninterface ApiService {\n\n    @GET(\"posts\")\n    fun getPosts(): Call<List<Post>>\n\n    \/\/ \u00d6rnek olarak ID'ye g\u00f6re tek bir post \u00e7ekme:\n    \/\/ @GET(\"posts\/{id}\")\n    \/\/ fun getPostById(@Path(\"id\") postId: Int): Call<Post>\n\n    \/\/ \u00d6rnek olarak query parametresi ile filtreleme:\n    \/\/ @GET(\"posts\")\n    \/\/ fun getPostsByUser(@Query(\"userId\") userId: Int): Call<List<Post>>\n}<\/code><\/pre>\n<p>*   <code>@GET(\"posts\")<\/code>: Bu annotation, bu metodun bir HTTP GET iste\u011fi g\u00f6nderece\u011fini ve iste\u011fin ana URL&#8217;ye ek olarak <code>\/posts<\/code> path&#8217;ine yap\u0131laca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <code>fun getPosts(): Call<List<Post>><\/code>: Bu metodun, <code>List<Post><\/code> tipinde bir yan\u0131t bekledi\u011fini ve bu yan\u0131t\u0131n Retrofit&#8217;in <code>Call<\/code> objesi i\u00e7inde paketlendi\u011fini g\u00f6sterir. <code>Call<\/code> objesi, asenkron veya senkron olarak iste\u011fi y\u00fcr\u00fctmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Retrofit \u0130stemcisini Olu\u015fturma ve \u0130stek Yapma<\/h3>\n<p>API aray\u00fcz\u00fcm\u00fcz\u00fc ve veri modellerimizi tan\u0131mlad\u0131\u011f\u0131m\u0131za g\u00f6re, art\u0131k bir Retrofit istemcisi olu\u015fturabilir ve a\u011f istekleri g\u00f6nderebiliriz.<\/p>\n<h4>Retrofit Instance Olu\u015fturma<\/h4>\n<p>Retrofit istemcisini olu\u015fturmak genellikle uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca bir kez yap\u0131lan bir i\u015flemdir. Bu nedenle, bir Singleton pattern kullanmak veya bir DI k\u00fct\u00fcphanesi (Hilt, Koin) ile y\u00f6netmek iyi bir pratik olacakt\u0131r. Basitlik ad\u0131na, bir <code>object<\/code> (Kotlin singleton) kullanarak Retrofit instance&#8217;\u0131m\u0131z\u0131 olu\u015ftural\u0131m. <code>app\/src\/main\/java\/your_package_name\/api\/RetrofitClient.kt<\/code> dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-kotlin\">package com.example.myretrofitapp.api\n\nimport okhttp3.OkHttpClient\nimport okhttp3.logging.HttpLoggingInterceptor\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport java.util.concurrent.TimeUnit\n\nobject RetrofitClient {\n\n    private const val BASE_URL = \"https:\/\/jsonplaceholder.typicode.com\/\"\n\n    \/\/ Logging Interceptor olu\u015fturma\n    private val loggingInterceptor = HttpLoggingInterceptor().apply {\n        level = HttpLoggingInterceptor.Level.BODY \/\/ T\u00fcm istek ve yan\u0131t g\u00f6vdelerini logla\n    }\n\n    \/\/ OkHttpClient olu\u015fturma ve Interceptor'\u0131 ekleme\n    private val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(loggingInterceptor)\n        .connectTimeout(30, TimeUnit.SECONDS) \/\/ Ba\u011flant\u0131 zaman a\u015f\u0131m\u0131\n        .readTimeout(30, TimeUnit.SECONDS)    \/\/ Okuma zaman a\u015f\u0131m\u0131\n        .writeTimeout(30, TimeUnit.SECONDS)   \/\/ Yazma zaman a\u015f\u0131m\u0131\n        .build()\n\n    \/\/ Retrofit instance'\u0131\n    val instance: ApiService by lazy {\n        val retrofit = Retrofit.Builder()\n            .baseUrl(BASE_URL)\n            .addConverterFactory(GsonConverterFactory.create()) \/\/ Gson ile JSON d\u00f6n\u00fc\u015ft\u00fcrme\n            .client(okHttpClient) \/\/ OkHttpClient'\u0131 Retrofit'e ekleme\n            .build()\n        retrofit.create(ApiService::class.java)\n    }\n}<\/code><\/pre>\n<p>*   <code>BASE_URL<\/code>: T\u00fcm API isteklerinin temel URL&#8217;si.<br \/>\n*   <code>HttpLoggingInterceptor<\/code>: OkHttp&#8217;nin bir par\u00e7as\u0131d\u0131r ve a\u011f isteklerinin ve yan\u0131tlar\u0131n\u0131n konsola (Logcat) yazd\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Hata ay\u0131klama (debugging) i\u00e7in \u00e7ok faydal\u0131d\u0131r.<br \/>\n*   <code>OkHttpClient<\/code>: Retrofit, a\u011f isteklerini yapmak i\u00e7in OkHttp&#8217;yi kullan\u0131r. OkHttpClient \u00fczerinden Interceptor&#8217;lar ekleyebilir, zaman a\u015f\u0131mlar\u0131n\u0131 ayarlayabilir ve di\u011fer a\u011f yap\u0131land\u0131rmalar\u0131n\u0131 yapabilirsiniz.<br \/>\n*   <code>Retrofit.Builder()<\/code>: Bir Retrofit instance&#8217;\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>baseUrl()<\/code>: Temel URL&#8217;yi ayarlar.<br \/>\n*   <code>addConverterFactory()<\/code>: Retrofit&#8217;in JSON gibi formatlardaki API yan\u0131tlar\u0131n\u0131 veri modellerimize nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrece\u011fini belirtir. Burada <code>GsonConverterFactory<\/code> kullan\u0131yoruz.<br \/>\n*   <code>client()<\/code>: \u00d6zelle\u015ftirilmi\u015f <code>OkHttpClient<\/code>&#8216;\u0131m\u0131z\u0131 Retrofit&#8217;e ekler.<br \/>\n*   <code>retrofit.create(ApiService::class.java)<\/code>: Olu\u015fturdu\u011fumuz <code>ApiService<\/code> aray\u00fcz\u00fcn\u00fcn bir implementasyonunu Retrofit&#8217;ten al\u0131r\u0131z. Bu sayede <code>getPosts()<\/code> gibi metodlar\u0131 \u00e7a\u011f\u0131rabiliriz.<br \/>\n*   <code>by lazy<\/code>: Bu, <code>instance<\/code> de\u011fi\u015fkeninin ilk eri\u015fildi\u011finde ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar, bu da kaynaklar\u0131n gereksiz yere t\u00fcketilmesini \u00f6nler.<\/p>\n<h4>A\u011f \u0130ste\u011fi Yapma ve Verileri \u0130\u015fleme<\/h4>\n<p>\u015eimdi <code>MainActivity<\/code> veya ba\u015fka bir <code>Fragment<\/code> i\u00e7inde bu Retrofit istemcisini kullanarak API iste\u011fimizi yapal\u0131m. Basit bir <code>TextView<\/code>&#8216;de ilk postun ba\u015fl\u0131\u011f\u0131n\u0131 g\u00f6sterece\u011fiz.<\/p>\n<pre><code class=\"language-kotlin\">package com.example.myretrofitapp\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.example.myretrofitapp.api.RetrofitClient\nimport com.example.myretrofitapp.model.Post\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var textViewResult: TextView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        textViewResult = findViewById(R.id.textViewResult)\n\n        fetchPosts()\n    }\n\n    private fun fetchPosts() {\n        \/\/ RetrofitClient'tan ApiService instance'\u0131m\u0131z\u0131 al\u0131yoruz\n        RetrofitClient.instance.getPosts().enqueue(object : Callback<List<Post>> {\n            override fun onResponse(call: Call<List<Post>>, response: Response<List<Post>>) {\n                if (response.isSuccessful) {\n                    val posts = response.body()\n                    posts?.let {\n                        \/\/ \u0130lk postun ba\u015fl\u0131\u011f\u0131n\u0131 TextView'e set et\n                        if (it.isNotEmpty()) {\n                            textViewResult.text = \"\u0130lk Post Ba\u015fl\u0131\u011f\u0131:\\n${it[0].title}\"\n                            \/\/ T\u00fcm postlar\u0131 Logcat'e yazd\u0131r\n                            it.forEach { post ->\n                                Log.d(\"RetrofitExample\", \"Post ID: ${post.id}, Title: ${post.title}\")\n                            }\n                        } else {\n                            textViewResult.text = \"Hi\u00e7 post bulunamad\u0131.\"\n                        }\n                    }\n                } else {\n                    \/\/ API yan\u0131t\u0131 ba\u015far\u0131l\u0131 de\u011filse (\u00f6rn. 404, 500)\n                    textViewResult.text = \"Hata: ${response.code()} - ${response.message()}\"\n                    Log.e(\"RetrofitExample\", \"API Hatas\u0131: ${response.code()} - ${response.message()}\")\n                }\n            }\n\n            override fun onFailure(call: Call<List<Post>>, t: Throwable) {\n                \/\/ A\u011f hatas\u0131 veya istisna durumunda\n                textViewResult.text = \"A\u011f Hatas\u0131: ${t.message}\"\n                Log.e(\"RetrofitExample\", \"A\u011f Hatas\u0131:\", t)\n            }\n        })\n    }\n}<\/code><\/pre>\n<p><code>activity_main.xml<\/code> dosyan\u0131zda sadece bir <code>TextView<\/code> yeterli olacakt\u0131r:<\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id\/textViewResult\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"18sp\"\n        android:textStyle=\"bold\"\n        android:text=\"Veriler y\u00fckleniyor...\" \/>\n\n<\/LinearLayout><\/code><\/pre>\n<p>*   <code>enqueue(object : Callback<List<Post>>)<\/code>: Bu metod, a\u011f iste\u011fini asenkron olarak arka planda y\u00fcr\u00fct\u00fcr ve ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke etmez. \u0130\u015flem tamamland\u0131\u011f\u0131nda veya hata olu\u015ftu\u011funda <code>Callback<\/code> aray\u00fcz\u00fcndeki metodlar \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>onResponse()<\/code>: Sunucudan bir yan\u0131t al\u0131nd\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r (ba\u015far\u0131l\u0131 HTTP kodu 2xx veya ba\u015far\u0131s\u0131z 4xx, 5xx olabilir).<br \/>\n    *   <code>response.isSuccessful<\/code>: HTTP yan\u0131t kodunun 200-299 aral\u0131\u011f\u0131nda olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n    *   <code>response.body()<\/code>: Ba\u015far\u0131l\u0131 bir yan\u0131tta, d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f veri modelini (bu durumda <code>List<Post><\/code>) i\u00e7erir.<br \/>\n    *   <code>response.code()<\/code> ve <code>response.message()<\/code>: Hata durumunda HTTP kodunu ve mesaj\u0131n\u0131 verir.<br \/>\n*   <code>onFailure()<\/code>: A\u011f ba\u011flant\u0131s\u0131 sorunlar\u0131 (internet yok, sunucuya ula\u015f\u0131lam\u0131yor) veya istek s\u0131ras\u0131nda bir istisna olu\u015ftu\u011funda \u00e7a\u011fr\u0131l\u0131r. <code>t.message<\/code> ile hata detaylar\u0131na eri\u015filebilir.<\/p>\n<p>Bu kod par\u00e7as\u0131, API&#8217;den postlar\u0131 \u00e7eker ve ilk postun ba\u015fl\u0131\u011f\u0131n\u0131 <code>TextView<\/code>&#8216;de g\u00f6sterirken, t\u00fcm postlar\u0131 da Logcat&#8217;e yazd\u0131r\u0131r.<\/p>\n<h3>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Retrofit ile \u00e7al\u0131\u015f\u0131rken uygulaman\u0131z\u0131n daha sa\u011flam, bak\u0131m\u0131 kolay ve performansl\u0131 olmas\u0131n\u0131 sa\u011flayacak baz\u0131 pratik ipu\u00e7lar\u0131 ve en iyi uygulamalar \u015funlard\u0131r:<\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>*   <strong>HTTP Hata Kodlar\u0131:<\/strong> <code>response.isSuccessful<\/code> kontrol\u00fc \u00f6nemlidir. Ancak sadece <code>false<\/code> olmas\u0131 yeterli de\u011fildir. Belirli hata kodlar\u0131na (\u00f6rne\u011fin 401 Unauthorized, 404 Not Found) \u00f6zel durumlar i\u00e7in <code>response.code()<\/code> de\u011ferini kontrol edin.<br \/>\n*   <strong>Hata G\u00f6vdeleri:<\/strong> API&#8217;ler genellikle hata durumlar\u0131nda da JSON format\u0131nda bir hata mesaj\u0131 d\u00f6ner. Bu hata mesajlar\u0131n\u0131 yakalamak i\u00e7in <code>response.errorBody()?.string()<\/code> metodunu kullanabilir ve bunu kendi hata modelinize d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<br \/>\n*   <strong>A\u011f Ba\u011flant\u0131s\u0131 Kontrol\u00fc:<\/strong> \u0130stek yapmadan \u00f6nce cihaz\u0131n internet ba\u011flant\u0131s\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek, <code>onFailure<\/code> callback&#8217;ine d\u00fc\u015fmeden kullan\u0131c\u0131ya daha iyi geri bildirim sunman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Retrofit Instance&#8217;\u0131 Singleton Olarak Y\u00f6netme<\/h4>\n<p><code>RetrofitClient<\/code> objesi ile zaten bir singleton pattern uygulam\u0131\u015f olduk. Bu yakla\u015f\u0131m, her a\u011f iste\u011fi i\u00e7in yeni bir Retrofit veya OkHttpClient instance&#8217;\u0131 olu\u015fturman\u0131n \u00f6n\u00fcne ge\u00e7er, b\u00f6ylece bellek ve performans a\u00e7\u0131s\u0131ndan verimlilik sa\u011flar.<\/p>\n<h4>Arka Plan \u0130\u015f Par\u00e7ac\u0131klar\u0131 ve UI G\u00fcncellemesi<\/h4>\n<p>Retrofit&#8217;in <code>enqueue()<\/code> metodu asenkron \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in a\u011f iste\u011fi arka planda yap\u0131l\u0131r. Ancak <code>onResponse<\/code> ve <code>onFailure<\/code> callback&#8217;leri genellikle ana i\u015f par\u00e7ac\u0131\u011f\u0131nda (main thread) \u00e7a\u011fr\u0131l\u0131r (Android&#8217;de). Bu nedenle UI g\u00fcncellemelerini do\u011frudan bu callback&#8217;ler i\u00e7inde yapabilirsiniz.<\/p>\n<h4>Interceptors Kullan\u0131m\u0131<\/h4>\n<p><code>HttpLoggingInterceptor<\/code> d\u0131\u015f\u0131nda, Interceptor&#8217;lar Retrofit&#8217;in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biridir. \u015eunlar i\u00e7in kullan\u0131labilir:<\/p>\n<p>*   <strong>Kimlik Do\u011frulama (Authentication):<\/strong> Her iste\u011fe otomatik olarak bir API anahtar\u0131 veya kimlik do\u011frulama token&#8217;\u0131 eklemek.<br \/>\n*   <strong>\u00d6zel Ba\u015fl\u0131klar (Headers):<\/strong> T\u00fcm isteklere belirli HTTP ba\u015fl\u0131klar\u0131 (\u00f6rne\u011fin <code>User-Agent<\/code>, <code>Accept-Language<\/code>) eklemek.<br \/>\n*   <strong>Yeniden Denemeler (Retries):<\/strong> Ba\u015far\u0131s\u0131z olan istekleri otomatik olarak belirli bir say\u0131da yeniden denemek.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ \u00d6rnek bir kimlik do\u011frulama Interceptor'\u0131\nclass AuthInterceptor(private val authToken: String) : Interceptor {\n    override fun intercept(chain: Interceptor.Chain): Response {\n        val originalRequest = chain.request()\n        val newRequest = originalRequest.newBuilder()\n            .header(\"Authorization\", \"Bearer $authToken\")\n            .build()\n        return chain.proceed(newRequest)\n    }\n}\n\n\/\/ OkHttpClient'a ekleme\n\/\/ private val okHttpClient = OkHttpClient.Builder()\n\/\/    .addInterceptor(loggingInterceptor)\n\/\/    .addInterceptor(AuthInterceptor(\"your_auth_token\"))\n\/\/    .build()<\/code><\/pre>\n<h4>Coroutines veya RxJava ile Entegrasyon<\/h4>\n<p>Modern Android geli\u015ftirme ortam\u0131nda, asenkron i\u015flemleri y\u00f6netmek i\u00e7in Kotlin Coroutines veya RxJava gibi reaktif programlama k\u00fct\u00fcphaneleri yayg\u0131n olarak kullan\u0131l\u0131r. Retrofit, bu k\u00fct\u00fcphanelerle entegre olmak i\u00e7in <code>CallAdapterFactory<\/code>&#8216;ler sunar.<\/p>\n<p>*   <strong>Coroutines:<\/strong> <code>suspend<\/code> fonksiyonlar ve <code>Flow<\/code> ile Retrofit metotlar\u0131n\u0131 tan\u0131mlayabilir, b\u00f6ylece daha okunakl\u0131 ve y\u00f6netilebilir asenkron kod yazabilirsiniz. Bunun i\u00e7in <code>kotlinx-coroutines-core<\/code> ve <code>retrofit2-kotlin-coroutines-adapter<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeniz ve Retrofit builder&#8217;\u0131na <code>addCallAdapterFactory(CoroutineCallAdapterFactory())<\/code> eklemeniz gerekir.<br \/>\n*   <strong>RxJava:<\/strong> <code>Observable<\/code>, <code>Single<\/code> veya <code>Completable<\/code> gibi RxJava tipleriyle API yan\u0131tlar\u0131n\u0131 i\u015fleyebilirsiniz. Bunun i\u00e7in <code>retrofit2:adapter-rxjava2<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 eklemeniz ve <code>addCallAdapterFactory(RxJava2CallAdapterFactory.create())<\/code> kullanman\u0131z gerekir.<\/p>\n<p>Bu entegrasyonlar, \u00f6zellikle karma\u015f\u0131k asenkron ak\u0131\u015flar ve veri d\u00f6n\u00fc\u015f\u00fcmleri s\u00f6z konusu oldu\u011funda kodunuzu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirebilir.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Bu rehberde, Retrofit&#8217;in ne oldu\u011funu, neden bu kadar pop\u00fcler oldu\u011funu, bir Android projesinde nas\u0131l kurulaca\u011f\u0131n\u0131, API aray\u00fczleri ve veri modelleriyle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ve a\u011f isteklerinin nas\u0131l yap\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. Ayr\u0131ca, Retrofit&#8217;i daha etkin kullanmak i\u00e7in pratik ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 da ele ald\u0131k. Retrofit, Android uygulamalar\u0131n\u0131zda a\u011f i\u015flemlerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve geli\u015ftirici dostu bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<p><H3>Retrofit nedir?<\/H3><\/p>\n<p>Retrofit, Android ve Java uygulamalar\u0131 i\u00e7in Square taraf\u0131ndan geli\u015ftirilmi\u015f, RESTful API&#8217;lerle type-safe bir \u015fekilde etkile\u015fim kurmay\u0131 sa\u011flayan bir HTTP istemci k\u00fct\u00fcphanesidir.<\/p>\n<p><H3>Neden Retrofit kullanmal\u0131y\u0131m?<\/H3><\/p>\n<p>Retrofit, API entegrasyonunu basitle\u015ftirir, type-safety sunar, JSON gibi veri formatlar\u0131n\u0131 kolayca d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, asenkron i\u015flemleri destekler ve Interceptor&#8217;lar arac\u0131l\u0131\u011f\u0131yla istek\/yan\u0131t s\u00fcre\u00e7lerine m\u00fcdahale etme esnekli\u011fi sa\u011flar. Ayr\u0131ca Coroutines ve RxJava gibi modern asenkron k\u00fct\u00fcphanelerle uyumludur.<\/p>\n<p><H3>Retrofit ile hangi HTTP metodlar\u0131n\u0131 kullanabilirim?<\/H3><\/p>\n<p>Retrofit, t\u00fcm standart HTTP metodlar\u0131n\u0131 destekler: @GET, @POST, @PUT, @DELETE, @PATCH, @HEAD, @OPTIONS.<\/p>\n<p><H3>Retrofit senkron ve asenkron istekleri nas\u0131l y\u00f6netir?<\/H3><\/p>\n<p>Retrofit&#8217;in d\u00f6nd\u00fcrd\u00fc\u011f\u00fc <code>Call<\/code> objesi \u00fczerinde <code>enqueue()<\/code> metodunu \u00e7a\u011f\u0131rarak asenkron (arka planda) istekler yapabilirsiniz. <code>execute()<\/code> metodunu \u00e7a\u011f\u0131rarak ise senkron (ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke eden) istekler yapabilirsiniz, ancak Android&#8217;de bu genellikle tavsiye edilmez ve ana i\u015f par\u00e7ac\u0131\u011f\u0131nda yap\u0131l\u0131rsa <code>NetworkOnMainThreadException<\/code> hatas\u0131na yol a\u00e7abilir.<\/p>\n<p><H3>Retrofit&#8217;te hata y\u00f6netimi nas\u0131l yap\u0131l\u0131r?<\/H3><\/p>\n<p>A\u011f hatalar\u0131 veya sunucu taraf\u0131ndaki hatalar i\u00e7in <code>enqueue()<\/code> metodunun <code>Callback<\/code> aray\u00fcz\u00fcndeki <code>onFailure()<\/code> ve <code>onResponse()<\/code> metodlar\u0131 kullan\u0131l\u0131r. <code>onResponse()<\/code> i\u00e7inde <code>response.isSuccessful<\/code> kontrol\u00fc ile HTTP yan\u0131t kodunun 2xx aral\u0131\u011f\u0131nda olup olmad\u0131\u011f\u0131na bak\u0131l\u0131r. Ba\u015far\u0131s\u0131z yan\u0131tlar i\u00e7in <code>response.code()<\/code> ve <code>response.errorBody()<\/code> incelenerek detayl\u0131 hata bilgisi al\u0131nabilir.<\/p>\n<p><H3>Retrofit JSON d\u0131\u015f\u0131ndaki formatlar\u0131 destekler mi?<\/H3><\/p>\n<p>Evet, Retrofit \u00e7e\u015fitli Converter Factory&#8217;ler arac\u0131l\u0131\u011f\u0131yla JSON (Gson, Moshi), XML (SimpleXML), Protobuf ve di\u011fer veri formatlar\u0131n\u0131 destekler. \u0130htiyac\u0131n\u0131za g\u00f6re uygun Converter Factory&#8217;yi <code>addConverterFactory()<\/code> metodu ile Retrofit builder&#8217;\u0131na eklemeniz yeterlidir.<\/p>\n<p><H3>Retrofit&#8217;i Coroutines veya RxJava ile nas\u0131l entegre ederim?<\/H3><\/p>\n<p>Coroutines ile entegrasyon i\u00e7in <code>retrofit2-kotlin-coroutines-adapter<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyip <code>Retrofit.Builder<\/code>&#8216;a <code>addCallAdapterFactory(CoroutineCallAdapterFactory())<\/code> ekleyerek API aray\u00fcz\u00fcn\u00fczdeki metodlar\u0131 <code>suspend<\/code> olarak tan\u0131mlayabilirsiniz. RxJava i\u00e7in ise <code>retrofit2:adapter-rxjava2<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyip <code>addCallAdapterFactory(RxJava2CallAdapterFactory.create())<\/code> kullanarak API metodlar\u0131n\u0131z\u0131 <code>Observable<\/code>, <code>Single<\/code> vb. gibi RxJava tipleriyle d\u00f6nd\u00fcrebilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri\nAndroid uygulamalar\u0131 geli\u015ftirirken, uzak sunucularla ileti\u015fim kurmak ve A","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-35263","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>Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri - 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\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri\" \/>\n<meta property=\"og:description\" content=\"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri Android uygulamalar\u0131 geli\u015ftirirken, uzak sunucularla ileti\u015fim kurmak ve A\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-27T12:41:28+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=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri\",\"datePublished\":\"2025-11-27T12:41:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\"},\"wordCount\":1984,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\",\"name\":\"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-27T12:41:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri\"}]},{\"@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":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri - 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\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri","og_description":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri Android uygulamalar\u0131 geli\u015ftirirken, uzak sunucularla ileti\u015fim kurmak ve A","og_url":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-27T12:41:28+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri","datePublished":"2025-11-27T12:41:28+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/"},"wordCount":1984,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/","url":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/","name":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-27T12:41:28+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/retrofit-ile-android-uygulamalarinda-guclu-ve-esnek-ag-istekleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Retrofit ile Android Uygulamalar\u0131nda G\u00fc\u00e7l\u00fc ve Esnek A\u011f \u0130stekleri"}]},{"@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\/35263","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=35263"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35263\/revisions"}],"predecessor-version":[{"id":35264,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35263\/revisions\/35264"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}