Використання проксі в Kotlin
Проксі в Kotlin
Kotlin працює на JVM і має повний доступ до Java API для роботи з проксі. Крім того, популярні бібліотеки Kotlin (OkHttp, Ktor) надають власні зручні API для налаштування проксі.
OkHttp (Рекомендовано)
OkHttp є найпопулярнішим HTTP-клієнтом для Kotlin/Android.
HTTP Проксі
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 Проксі
val proxy = Proxy(
Proxy.Type.SOCKS,
InetSocketAddress("proxy_ip", 1080)
)
val client = OkHttpClient.Builder()
.proxy(proxy)
.build()
Аутентифікація
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, нативний для Kotlin.
HTTP Проксі
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 Engine
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")
}
}
SOCKS через Ktor
val client = HttpClient(OkHttp) {
engine {
proxy = Proxy(
Proxy.Type.SOCKS,
InetSocketAddress("proxy_ip", 1080)
)
}
}
Java Proxy API
Стандартний Java API працює в Kotlin:
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
// Аутентификация
val encoded = java.util.Base64.getEncoder()
.encodeToString("user:pass".toByteArray())
connection.setRequestProperty("Proxy-Authorization", "Basic $encoded")
connection.inputStream.bufferedReader().use { reader ->
println(reader.readText())
}
Ротація проксі
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
Системні проксі Android
На Android можна використовувати системні проксі:
val proxyHost = System.getProperty("http.proxyHost")
val proxyPort = System.getProperty("http.proxyPort")?.toIntOrNull()
NetworkSecurityConfig
Для роботи з проксі на Android 7+ необхідно налаштувати network_security_config.xml, щоб дозволити cleartext traffic (якщо проксі є HTTP).
Retrofit + Проксі
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()
Тайм-аути та налаштування
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()
Висновок
Kotlin пропонує кілька способів роботи з проксі: OkHttp для простоти та продуктивності, Ktor для асинхронного підходу на основі корутин, а також стандартний Java API для сумісності. Для розробки на Android OkHttp + Retrofit є галузевим стандартом. Усі варіанти підтримують HTTP та SOCKS5 проксі з аутентифікацією.