1. 添加依赖
Ktor 提供了一个灵活的基于协程的异步 HTTP 客户端,客户端支持多个可配置的引擎,不同的引擎有不同的配置,依赖和功能
io.ktor:ktor-client-core 是 Ktor 客户端的核心库,它是所有引擎的公共通用接口
2. 多平台多引擎
要使用 HttpClient,你还应该添加一个实现依赖,它支持多种平台多个引擎
配置引擎
通过使用 HttpClient() 并传入引擎单例,可以创建一个特定引擎的 HttpClient
例如: HttpClient(MyEngine)
Ktor 允许你通过如下方式为引擎配置参数, 引擎有一些通用属性
1 2 3 4 5 |
HttpClient(Curl) { this: HttpClientConfig<CurlEngineConfig> engine { this: CurlEngineConfig threadsCount = 6 } } |
JVM 平台
Apache
Apache 支持 HTTP/1.1 和 HTTP/2,支持 followRedirects,支持 Proxy
io.ktor:ktor-client-apache
它包含了 org.apache.httpcomponents:httpasyncclient 依赖
CIO
CIO (Coroutine-based I/O) 基于协程 IO,并且完全是异步的,它目前只支持 HTTP/1.x
io.ktor:ktor-client-cio
Jetty
Jetty 提供了 sslContextFactory 配置, 目前仅支持 HTTP/2
io.ktor:ktor-client-jetty
它包含了 org.eclipse.jetty.http2 依赖
JVM / Android 平台
OkHttp
该引擎基于 OkHttp
io.ktor:ktor-client-okhttp
它包含了 com.squareup.okhttp3:okhttp 依赖
Android
该引擎基于使用线程池管理的 HttpURLConnection
io.ktor:ktor-client-android
JS 平台
Js 引擎使用了 fetch API,对于 node.js 运行时, 使用 node-fetch API
io.ktor:ktor-client-js
iOS 平台
iOS 引擎使用了异步的 NSURLSession
io.ktor:ktor-client-ios
Native 平台
Curl
Curl 支持 linux_x64, macos_x64, mingw_x64
要使用该引擎,终端必须安装最低 7.63 版的 curl 支持库
io.ktor:ktor-client-curl
3. 请求
构建 Request
HttpClient 有 call() 扩展方法,它是一个挂起函数,用于构建并立即发送一个请求,当请求完成后返回一个 HttpClientCall 实例
call 函数接受一个 HttpRequestBuilder 实例,用它来配置请求
HttpRequestBuilder 提供了如下属性和方法用于配置请求
- val url: URLBuilder = URLBuilder() – 用于配置 url 的 URLBuilder
- var method: HttpMethod – 配置该请求的类型,默认为 HttpMethod.get
- override val headers: HeadersBuilder – 配置请求头
- var body: Any = EmptyContent – 配置请求正文
- val executionContext: Job – 用于控制请求执行的协程 Job
- var attributes: Attributes – 请求特定的属性
- fun url(block: URLBuilder.(URLBuilder) -> Unit): Unit – 执行一个 block 来配置 URLBuilder
- fun build(): HttpRequestData – 创建一个不可变的 HttpRequestData
- fun setAttributes(block: Attributes.() -> Unit) – 配置 attribute
- fun taleFrom(builder: HttpRequestBuilder): HttpRequestBuilder – 复制 builder
HttpRequest.kt 中还定义了一个 HttpRequestBuilder.url(urlString) 扩展函数,它是 url.takeFrom(urlString) 的快捷方式
call 还有一个使用 block 的重载形式,它有一个接收者为 HttpRequestBuilder 的参数,可以以 lambda 的形式配置 HttpRequestBuilder
处理 Response
当通过 call 得到 ApplicationCall 实例后,我们可以通过其 response 属性获取 Http 响应
response 是一个 HttpResponse 实例,HttpResponse 抽象类继承自 HttpMessage,有如下属性和方法
- val call: HttpClientCall – 持有 call 的引用
- val status: HttpStatusCode – Http 状态码
- val version: HttpProtocolVersion – Http 版本
- val requestTime: GMTDate – 请求时间
- val responseTime: GMTDate – 响应时间
- val executionContext: Job – 用于控制请求处理的协程 Job
- [super] val headers: Headers – 头
- val content: ByteReadChannel – 响应内容的 payload
通过这些属性和方法,可以处理 Response
在 HttpClientCall.kt 中,还定义了 <reified T> HttpResponse.receive() 扩展方法
该方法可以将 content 直接转换为指定的泛型类型,比如 receive<String>() 会直接将 content 转换为 String 并返回
request 及其他快捷扩展方法
builders.kt 中有一些包装了 call() 的扩展方法
<reified T> HttpClient.request() 可以构建一个 Request,并返回指定类型的数据
当使用 request<HttpResponse> 时,该方法会返回一个 HttpResponse 实例
当把泛型指定为 String、ByteArray… 时,该方法会返回响应正文的 String、ByteArray
相当于使用了 HttpResponse.receive<T>() 扩展方法
除了 request 以外,还有 get、post、put、delete、options、patch、head 方法及各种重载形式,它们是对于 request 的二次包装
4. 测试
Ktor 为 HttpClient 提供了一个 MockEngine,该引擎允许模拟 HTTP 请求,而无需真正连接到指定的终端。可以在配置引擎时定义代码块来处理 Request 并生成 Response
详情查看:Ktor Testing
5. 功能
与 Ktor 服务端类似,Ktor 客户端也支持 Features,它们都具有相同的设计:有一个用于客户端请求的管道(pipeline),有拦截器和可安装的功能
详情查看:Ktor Features
Auth
Default Request
Cookies
Text 和 Charsets
Redirect
Json
Loggin
Proxy
Response Validation
User Agent
6. WebSockets
Ktor 为以下引擎都提供了 WebSocket 客户端:CIO,OkHttp,Js
更多详情,查看 Ktor WebSockets
发表评论