Modern Kotlin/Android için basit, esnek ve genişletilebilir bir network kütüphanesi. Bu repo, hem kütüphaneyi (GNetwork) hem de onu kullanan küçük bir test uygulamasını (app) içerir.
- Kolay DSL:
httpClient {},client.get<T>(...) {} - Interceptor zinciri: Logging, Auth ve kolay genişletilebilir mimari
- SSL/TLS: Özel TrustManager, HostnameVerifier ve Certificate Pinning
- GZip ve charset desteği; doğru gövde okuma
- Net sonuç modeli:
HttpResponse.Success/Failure/Error
- Demo/Test Uygulaması
- Modül Yapısı
- Kurulum
- Hızlı Başlangıç
- Kullanım Örnekleri
- Interceptor'lar
- SSL/TLS Yapılandırması
- HTTP Yanıt Modeli
- Yol Haritası
- Sorun Giderme
- Lisans
app modülü, kütüphaneyi kullanarak open-meteo üzerinden hava durumu verisi çeker ve ekranda gösterir.
Özellikler:
httpClientDSL ilebaseUrl, headers ve interceptor kurulumuclient.get<WeatherResponse<CurrentUnits>>(...)örneği- Compose ile basit bir UI ve butona basıldığında veri çekme
Çalıştırma:
- Projeyi Android Studio ile açın
- Cihaz/Emülatör seçin
appmodülünü çalıştırın
GNetwork/— Network kütüphanesi (ana odak)app/— Kütüphaneyi kullanan örnek Android uygulaması
Bu repo bir çoklu-modül Android projesi olarak hazır gelir. Kütüphaneyi doğrudan bu repo içinde kullanabilirsiniz.
Başka bir projeye dahil etmek isterseniz (örn. monorepo):
- settings.gradle(.kts) içine
include(":GNetwork") - app build.gradle(.kts):
implementation(project(":GNetwork"))
Not: Kütüphane Kotlin Serialization kullanır; kendi projenizde de uygun Kotlin/Gradle sürümleri olmalıdır.
val client = httpClient {
baseUrl = "https://api.open-meteo.com/"
// Varsayılan header'lar
headers {
this["accept"] = "*/*"
this["accept-encoding"] = "gzip"
this["accept-language"] = "en"
}
// Interceptor zinciri (sıra önemlidir)
addInterceptor(AuthInterceptor { /* token sağlayın veya null dönün */ null })
addInterceptor(LoggingInterceptor(level = LoggingInterceptor.Level.BODY))
}val resp = client.get<WeatherResponse<CurrentUnits>>("v1/forecast") {
queryParam("latitude", "38.643976")
queryParam("longitude", "34.734958")
queryParam("hourly", "temperature_2m")
queryParam("current", "temperature_2m,relative_humidity_2m") // virgüller korunur
}
resp.onSuccess { data ->
// data.current?.temperature_2m vb.
}.onFailure { http ->
// http.statusCode, http.errorBody
}.onError { err ->
// err.exception (timeout, bağlantı, vb.)
}val resp = client.post<MyResponse>("users") {
jsonBody {
"name" to "Gökhan Akbaş"
"email" to "gokhan@example.com"
"age" to 30
}
}val resp = client.get<String>("search") {
queryParams(
"q" to "hava durumu",
"page" to "1",
)
header("X-Trace-Id", "abc-123")
}Interceptor mimarisi OkHttp benzeri bir zincir mantığıyla çalışır. İstek, eklediğiniz interceptor'lar üzerinden terminal (ağ) katmanına iner.
Okunabilir, şık log formatı ve seviyeler:
NONE: Log yokBASIC: Metot, URL, durum kodu, süreHEADERS: + istek/yanıt header'larıBODY: + istek/yanıt gövdeleri (JSON pretty-print)
Örnek:
addInterceptor(
LoggingInterceptor(
logger = { Log.d("GNetwork", it) },
level = LoggingInterceptor.Level.BODY
)
)Daha fazla örnek ve ekran görüntüsü: LOGGING_GUIDE.md
Token veya header eklemek için kullanılır. Token sağlayıcınız suspend fonksiyon olabilir.
addInterceptor(AuthInterceptor(headerName = "Authorization") { tokenProvider() })- Özel
SSLSocketFactoryveX509TrustManagerile kurumsal CA/self-signed sertifikalar HostnameVerifierözelleştirme (gerekirse)- Certificate Pinning (public key SHA-256)
Örnek: Certificate Pinning
sslConfig {
certificatePinner(
CertificatePinner.builder()
.add(
"api.example.com",
"sha256/PRIMARY_PIN_BASE64=",
"sha256/BACKUP_PIN_BASE64="
)
.build()
)
}Debug (sadece geliştirme/test için):
sslConfig { trustAllCertificates() } // Production'da KULLANMAYIN!Detaylı rehber: SSL_TLS_GUIDE.md
sealed class HttpResponse<out T> {
data class Success<T>(val body: T, val statusCode: Int, val headers: ResponseHeaders, val rawResponse: String?)
data class Failure(val statusCode: Int, val errorMessage: String, val errorBody: String?, val headers: ResponseHeaders)
data class Error(val exception: Throwable, val message: String = exception.message ?: "Unknown error")
}Ergonomi yardımcıları:
onSuccess {},onFailure {},onError {}getOrNull(),getOrDefault(default),getOrThrow()
- RetryInterceptor (exponential backoff, idempotent metodlar)
- CacheInterceptor (ETag, Cache-Control, disk/memory)
- Multipart/Form-Data (dosya upload)
- Progress takibi (upload/download)
- TimeoutInterceptor (call-level timeout)
- Metrics/AnalyticsInterceptor
- Redirect yönetimi (307/308 method/body preservation)
,(virgül) encode edilmeden gönderilir (open-meteo gibi API'lar için gereklidir).Accept-Encoding: gzipvarsayılan olarak eklenir; yanıtContent-Encoding: gzipise otomatik açılır.charsetContent-Typeüzerinden okunur; yoksa UTF-8 varsayılır.- Coroutine iptalinde
disconnect()çağrılır (cancel destekli).
Bu projede kullanılan bağımlılıkların lisansları için: THIRD_PARTY_NOTICES.md
Bu proje MIT lisansı ile lisanslanmıştır. Ayrıntılar için LICENSE dosyasına bakınız.