LoginSignup
2
1

More than 5 years have passed since last update.

Ktor HttpClientでREST

Posted at

これまでに Ktor HttpClient を使って GETPOST を動かしてみました。
REST API をたたく場合は、それ以外にも PUT や DELETE などが必要になってくると思います。
そこで今回は PUT を動かしてみました。

PUT

ソースは次のようになります。
build.gradle は POST の場合と同じですので省略します。

import io.ktor.client.HttpClient
import io.ktor.client.engine.apache.Apache
import io.ktor.client.request.request
import io.ktor.client.response.HttpResponse
import io.ktor.client.response.readText
import io.ktor.http.HttpMethod
import io.ktor.content.OutgoingContent.ReadChannelContent
import io.ktor.cio.readChannel
import kotlinx.coroutines.experimental.runBlocking
import java.io.File

fun main( args: Array<String> ) {
    HttpClient( Apache ).use {
        val response = runBlocking {
            it.request<HttpResponse> {
                url {
                    host = "localhost"
                    port = 8000
                    encodedPath = "/put"
                }
                method = HttpMethod.Put
                body = object: ReadChannelContent() {
                    override fun readFrom() = File( "data.bin" ).readChannel()
                }
            }.use { res ->
                println( res.version )
                println( res.status )
                res.headers.forEach { k, v ->
                    println( "$k: $v" )
                }
                res.readText()
            }
        }

        println( "$response" )
    }
}

ktor-client-core の builders.kt には、HttpClient の拡張関数として get(), post() が定義されていますが、それ以外の HTTPメソッドは用意されていませんでした。
そこでこれも HttpClient への拡張関数ですが、request() を使います。(get, post も内部では reuqest を呼んでいました。)

request() の引数は builder: HttpRequestBuilder です。

HTTPメソッド

HttpRequestBuilder には method という HttpMethod 型のプロパティがあり、デフォルトは HttpMethod.Get です。

var method = HttpMethod.Get

この変数に使いたい HTTPメソッドをセットします。
HttpMethod クラスに用意されている HTTP メソッドは次のようになります。

メソッド 定義
GET HttpMethod.Get
POST HttpMethod.Post
PUT HttpMethod.Put
PATCH HttpMethod.Patch
DELETE HttpMethod.Delete
HEAD HttpMethod.Head
OPTIONS HttpMethod.Options

接続先指定

接続先は次のように指定しています。

url {
    host = "localhost"
    port = 8000
    encodedPath = "/put"
}

これは URLBuilder のコンストラクタを呼んでいます。パラメーターとデフォルト値は次のように定義されています。

class URLBuilder(
        var protocol: URLProtocol = URLProtocol.HTTP,
        var host: String = "localhost",
        var port: Int = protocol.defaultPort,
        var user: String? = null,
        var password: String? = null,
        var encodedPath: String = "/",
        val parameters: ParametersBuilder = ParametersBuilder(),
        var fragment: String = "",
        var trailingQuery: Boolean = false
) {

HTTPボディ(送信データ)

body には送信するデータを渡します。使い方は POST と同じですので、こちらを参考にしてください。

HEAD

今回は PUT を使ってみましたが、DELETE や PATCH でも基本的には同じコーディングになると思います。
HEAD も試してみましたので合わせて掲載しておきます。

import io.ktor.client.HttpClient
import io.ktor.client.engine.apache.Apache
import io.ktor.client.request.request
import io.ktor.client.response.HttpResponse
import io.ktor.client.response.readText
import kotlinx.coroutines.experimental.runBlocking
import io.ktor.http.URLBuilder
import io.ktor.http.HttpMethod
import java.nio.charset.StandardCharsets

fun main( args: Array<String> ) {
    HttpClient( Apache ).use {
        val response = runBlocking {
            it.request<HttpResponse> {
                url { host = "www.example.com" }
                method = HttpMethod.Head
            }.use { res ->
                println( res.version )
                println( res.status )
                res.headers.forEach { k, v ->
                    println( "$k: $v" )
                }
                res.readText()
            }
        }

        println( "body=$response" )
    }
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1