阿特我自己
[email protected]
Hello WvT
Ktor 客户端
Ktor 客户端

1. 添加依赖

Ktor 提供了一个灵活的基于协程异步 HTTP 客户端,客户端支持多个可配置的引擎,不同的引擎有不同的配置,依赖和功能

io.ktor:ktor-client-core 是 Ktor 客户端的核心库,它是所有引擎的公共通用接口

2. 多平台多引擎

要使用 HttpClient,你还应该添加一个实现依赖,它支持多种平台多个引擎

配置引擎

通过使用 HttpClient() 并传入引擎单例,可以创建一个特定引擎的 HttpClient

例如: HttpClient(MyEngine)

Ktor 允许你通过如下方式为引擎配置参数, 引擎有一些通用属性

JVM 平台

Apache

Apache 支持 HTTP/1.1HTTP/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

HttpClientcall() 扩展方法,它是一个挂起函数,用于构建并立即发送一个请求,当请求完成后返回一个 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 以外,还有 getpostputdeleteoptionspatchhead 方法及各种重载形式,它们是对于 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

赞赏

发表评论

textsms
account_circle
email

Hello WvT

Ktor 客户端
1. 添加依赖 Ktor 提供了一个灵活的基于协程的异步 HTTP 客户端,客户端支持多个可配置的引擎,不同的引擎有不同的配置,依赖和功能 io.ktor:ktor-client-core 是 Ktor 客户端的核心…
扫描二维码继续阅读
2019-10-28


没有激活的小工具