Kotlin'de Proxy Kullanımı
Kotlin'de Proxy'ler
Kotlin, JVM üzerinde çalışır ve proxy'lerle çalışmak için Java API'sine tam erişime sahiptir. Ayrıca popüler Kotlin kütüphaneleri (OkHttp, Ktor) proxy yapılandırması için kendi kullanışlı API'lerini sunar.
OkHttp (Önerilen)
OkHttp, Kotlin/Android için en popüler HTTP istemcisidir.
HTTP Proxy
import okhttp3.OkHttpClient
import okhttp3.Request
import java.net.InetSocketAddress
import java.net.Proxy
val proxy = Proxy(
Proxy.Type.HTTP,
InetSocketAddress("proxy_ip", 8080)
)
val client = OkHttpClient.Builder()
.proxy(proxy)
.build()
val request = Request.Builder()
.url("https://httpbin.org/ip")
.build()
client.newCall(request).execute().use { response ->
println(response.body?.string())
}
SOCKS5 Proxy
val proxy = Proxy(
Proxy.Type.SOCKS,
InetSocketAddress("proxy_ip", 1080)
)
val client = OkHttpClient.Builder()
.proxy(proxy)
.build()
Kimlik Doğrulama
import okhttp3.Authenticator
import okhttp3.Credentials
import okhttp3.Route
val proxyAuthenticator = Authenticator { _: Route?, response: okhttp3.Response ->
val credential = Credentials.basic("username", "password")
response.request.newBuilder()
.header("Proxy-Authorization", credential)
.build()
}
val client = OkHttpClient.Builder()
.proxy(proxy)
.proxyAuthenticator(proxyAuthenticator)
.build()
Ktor Client
Ktor, JetBrains'in Kotlin'e özgü asenkron framework'üdür.
HTTP Proxy
import io.ktor.client.*
import io.ktor.client.engine.okhttp.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import java.net.InetSocketAddress
import java.net.Proxy
val client = HttpClient(OkHttp) {
engine {
proxy = Proxy(
Proxy.Type.HTTP,
InetSocketAddress("proxy_ip", 8080)
)
}
}
suspend fun main() {
val response: HttpResponse = client.get("https://httpbin.org/ip")
println(response.bodyAsText())
client.close()
}
CIO Motoru ile
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
val client = HttpClient(CIO) {
engine {
proxy = io.ktor.client.engine.ProxyBuilder.http("http://proxy_ip:8080")
}
}
Ktor Üzerinden SOCKS
val client = HttpClient(OkHttp) {
engine {
proxy = Proxy(
Proxy.Type.SOCKS,
InetSocketAddress("proxy_ip", 1080)
)
}
}
Java Proxy API
Standart Java API'si Kotlin'de de çalışır:
import java.net.HttpURLConnection
import java.net.InetSocketAddress
import java.net.Proxy
import java.net.URL
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("proxy_ip", 8080))
val url = URL("https://httpbin.org/ip")
val connection = url.openConnection(proxy) as HttpURLConnection
// Kimlik doğrulama
val encoded = java.util.Base64.getEncoder()
.encodeToString("user:pass".toByteArray())
connection.setRequestProperty("Proxy-Authorization", "Basic $encoded")
connection.inputStream.bufferedReader().use { reader ->
println(reader.readText())
}
Proxy Rotasyonu
import okhttp3.OkHttpClient
import okhttp3.Request
import java.net.InetSocketAddress
import java.net.Proxy
data class ProxyConfig(val host: String, val port: Int, val user: String, val pass: String)
val proxies = listOf(
ProxyConfig("proxy1", 8080, "user", "pass"),
ProxyConfig("proxy2", 8080, "user", "pass"),
ProxyConfig("proxy3", 8080, "user", "pass"),
)
fun getClient(proxyConfig: ProxyConfig): OkHttpClient {
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress(proxyConfig.host, proxyConfig.port))
return OkHttpClient.Builder()
.proxy(proxy)
.proxyAuthenticator { _, response ->
val credential = okhttp3.Credentials.basic(proxyConfig.user, proxyConfig.pass)
response.request.newBuilder()
.header("Proxy-Authorization", credential)
.build()
}
.build()
}
fun fetchWithRotation(url: String): String? {
val proxy = proxies.random()
val client = getClient(proxy)
val request = Request.Builder().url(url).build()
return try {
client.newCall(request).execute().use { it.body?.string() }
} catch (e: Exception) {
println("Failed with ${proxy.host}: ${e.message}")
null
}
}
Android'e Özgü Hususlar
Android Sistem Proxy'leri
Android'de sistem proxy'lerini kullanabilirsiniz:
val proxyHost = System.getProperty("http.proxyHost")
val proxyPort = System.getProperty("http.proxyPort")?.toIntOrNull()
NetworkSecurityConfig
Android 7+ üzerinde proxy'lerle çalışmak için, cleartext trafiğe izin vermek amacıyla network_security_config.xml dosyasını yapılandırmanız gerekir (proxy HTTP ise).
Retrofit + Proxy
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("proxy_ip", 8080))
val okHttpClient = OkHttpClient.Builder().proxy(proxy).build()
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
Zaman Aşımları ve Ayarlar
import java.util.concurrent.TimeUnit
val client = OkHttpClient.Builder()
.proxy(proxy)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build()
Sonuç
Kotlin, proxy'lerle çalışmak için birkaç yol sunar: basitlik ve performans için OkHttp, coroutine tabanlı asenkron yaklaşım için Ktor ve uyumluluk için standart Java API'si. Android geliştirmede OkHttp + Retrofit sektör standardıdır. Tüm seçenekler, kimlik doğrulamalı HTTP ve SOCKS5 proxy'lerini destekler.
