代理
Ktor HTTP client 允许你在多平台项目中配置代理设置。 支持两种类型的代理:HTTP 和 SOCKS。
支持的引擎
下表显示了特定引擎支持的代理类型:
| 引擎 | HTTP 代理 | SOCKS 代理 |
|---|---|---|
| Apache | ✅ | ✖️ |
| Java | ✅ | ✖️ |
| Jetty | ✖️ | ✖️ |
| CIO | ✅ | ✖️ |
| Android | ✅ | ✅ |
| OkHttp | ✅ | ✅ |
| JavaScript | ✖️ | ✖️ |
| Darwin | ✅ | ✅ |
| Curl | ✅ | ✅ |
请注意,Darwin 引擎的 HTTP 代理目前不支持 HTTPS 请求。
添加依赖项
要在客户端中配置代理,你不需要添加特定的依赖项。所需的依赖项包括:
配置代理
要配置代理设置,请在客户端配置块内调用 engine 函数,然后使用 proxy 属性。 此属性接受 ProxyConfig 实例,该实例可以使用 ProxyBuilder 工厂创建。
kotlin
val client = HttpClient() {
engine {
proxy = // 创建代理配置
}
}HTTP 代理
下面的示例显示了如何使用 ProxyBuilder 配置 HTTP 代理:
kotlin
val client = HttpClient() {
engine {
proxy = ProxyBuilder.http("http://sample-proxy-server:3128/")
}
}在 JVM 上,ProxyConfig 被映射到 Proxy 类,因此你可以按如下方式配置代理:
kotlin
val client = HttpClient() {
engine {
proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("sample-proxy-server", 3128))
}
}SOCKS 代理
下面的示例显示了如何使用 ProxyBuilder 配置 SOCKS 代理:
kotlin
val client = HttpClient() {
engine {
proxy = ProxyBuilder.socks(host = "sample-proxy-server", port = 1080)
}
}与 HTTP 代理一样,在 JVM 上你可以使用 Proxy 来配置代理设置:
kotlin
val client = HttpClient() {
engine {
proxy = Proxy(Proxy.Type.SOCKS, InetSocketAddress("sample-proxy-server", 1080))
}
}代理身份验证与授权
代理身份验证和授权是特定于引擎的,应手动处理。 例如,要使用基本身份验证将 Ktor 客户端通过身份验证连接到 HTTP 代理服务器,请按如下方式将 Proxy-Authorization 标头附加到每个请求:
kotlin
val client = HttpClient() {
defaultRequest {
val credentials = Base64.getEncoder().encodeToString("jetbrains:foobar".toByteArray())
header(HttpHeaders.ProxyAuthorization, "Basic $credentials")
}
}要在 JVM 上将 Ktor 客户端通过身份验证连接到 SOCKS 代理,你可以使用 java.net.socks.username 和 java.net.socks.password 系统属性。
