Dart/Flutter'da proxy kullanımı
Dart/Flutter'da proxy'ler
Dart, Flutter uygulamaları için bir programlama dilidir. Dart'ta proxy'lerle çalışma, standart HttpClient ve popüler kütüphaneler (dio, http) aracılığıyla yapılır.
Standart HttpClient
HTTP proxy
import 'dart:io';
void main() async {
final client = HttpClient();
// Proxy yapılandırması
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
await response.transform(utf8.decoder).forEach(print);
client.close();
}
Kimlik doğrulama ile
import 'dart:io';
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Proxy kimlik doğrulamasının işlenmesi
client.authenticate = (uri, scheme, realm) async {
client.addProxyCredentials(
"proxy_ip",
8080,
"realm",
HttpClientBasicCredentials("username", "password")
);
return true;
};
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
await response.transform(utf8.decoder).forEach(print);
client.close();
}
Doğrudan bağlantı (proxy'siz)
client.findProxy = (uri) => "DIRECT";
Koşullu yönlendirme
client.findProxy = (uri) {
if (uri.host.contains("target-site.com")) {
return "PROXY proxy_ip:8080";
}
return "DIRECT";
};
Dio kütüphanesi
Dio, Flutter için en popüler HTTP kütüphanesidir.
Kurulum
# pubspec.yaml
dependencies:
dio: ^5.4.0
dio_proxy_adapter: ^0.0.2 # proxy'ler için
Dio ile HTTP proxy
import 'package:dio/dio.dart';
import 'dart:io';
void main() async {
final dio = Dio();
// HttpClient adaptörü üzerinden proxy yapılandırması
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Kendinden imzalı sertifikalar için (test)
client.badCertificateCallback = (cert, host, port) => true;
return client;
};
final response = await dio.get("https://httpbin.org/ip");
print(response.data);
}
Kimlik doğrulama ile
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) => "PROXY proxy_ip:8080";
client.addProxyCredentials(
"proxy_ip",
8080,
"",
HttpClientBasicCredentials("user", "pass")
);
return client;
};
SOCKS5 proxy
socks5_proxy ile
# pubspec.yaml
dependencies:
socks5_proxy: ^1.0.4
import 'dart:io';
import 'package:socks5_proxy/socks_client.dart';
void main() async {
// SOCKS5 istemcisi oluşturma
final proxy = SocksTCPClient.connect(
[ProxySettings(InternetAddress("proxy_ip"), 1080,
password: Password("username", "password"))],
InternetAddress("93.184.216.34"), // hedef IP
80,
);
// Socket'i HTTP istekleri için kullanın
}
Sistem proxy'si üzerinden SOCKS ile
client.findProxy = (uri) {
return "SOCKS5 proxy_ip:1080";
};
Not: Dart'taki standart HttpClient yalnızca PROXY (HTTP) ve DIRECT destekler. SOCKS için üçüncü taraf kütüphaneler gereklidir.
Flutter'a özgü noktalar
Android yapılandırması
Android'de şifrelenmemiş (cleartext) HTTP proxy'lerle çalışmak için network_security_config.xml ayarı gereklidir:
<!-- android/app/src/main/res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
iOS yapılandırması
iOS'ta proxy'ler URLSession sistem ayarları üzerinden çalışır. Flutter uygulaması sistem proxy'sini otomatik olarak kullanır.
Ortam değişkenleri
Debug modunda proxy'ler değişkenler aracılığıyla ayarlanabilir:
// Başlatma argümanları aracılığıyla
// flutter run --dart-define=HTTP_PROXY=http://proxy_ip:8080
Proxy rotasyonu
import 'dart:io';
import 'dart:math';
final proxies = [
"PROXY proxy1:8080",
"PROXY proxy2:8080",
"PROXY proxy3:8080",
];
final random = Random();
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return proxies[random.nextInt(proxies.length)];
};
// İstekler farklı proxy'ler kullanacak
for (var i = 0; i < 10; i++) {
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
final body = await response.transform(utf8.decoder).join();
print("Request $i: $body");
}
client.close();
}
Hata yönetimi
try {
final request = await client.getUrl(uri);
final response = await request.close();
// yanıtı işle
} on SocketException catch (e) {
print("Connection error: $e");
} on HttpException catch (e) {
print("HTTP error: $e");
} on HandshakeException catch (e) {
print("TLS/SSL error: $e");
} catch (e) {
print("Unexpected error: $e");
}
Sonuç
Dart ve Flutter, HTTP proxy'lerle çalışmak için temel ancak yeterli araçlar sunar. Gelişmiş senaryolar (SOCKS5, kimlik doğrulama) için Dio'yu özel bir HttpClient adaptörüyle kullanın. Flutter uygulamaları geliştirirken Android ve iOS platformlarının özelliklerini dikkate alın.
