しおしお

IntelliJ IDEAのことなんかを書いてます

IntelliJ IDEAのHTTP Clientでレスポンス内容を他のリクエストで使用する方法

やりたいこと

APIから返ってきたレスポンスの内容を他のリクエストのヘッダなどで使用したい。 例えば、レスポンス内に含まれるアクセストークンを他のリクエストのヘッダに設定したいなんてことをしたい。

試した環境

サーバ側のコード

サーバ側の実装です。

  • GETでヘッダーに値を設定して、ボディにはjsonを返しています
  • POSTではjsonをdata classで受け取って標準出力に出力しています
fun Application.module(testing: Boolean = false) {
    install(ContentNegotiation) {
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }

    routing {
        get("/") {
            call.response.header("X-HOGE", "fuga")
            call.respond(mapOf("hello" to "world"))
        }

        post("/") {
            val hoge = call.receive<Hoge>()
            println("hoge = ${hoge}")
        }
    }
}

data class Hoge(val hello: String, val hoge: String)

HTTP Clientを使ってレスポンスの内容を他のリクエストで使ってみる

ドキュメント(Response Handling Examples - Help | IntelliJ IDEA)を参考に、 .http ファイルを作ってみます。

  • GETを呼び出した後のレスポンスの内容を client.global.set を使って設定することで次のリクエスでその値を使えるようになります
  • レスポンスヘッダを使いたい場合には、 response.headers.valuesOf を使ってヘッダの値を取得します
  • ボディのjsonの値を使いたい場合には、 response.body を使って取得します
  • client.global.set を使って設定した値は、 {{変数名}} で参照できます
GET http://localhost:8080

> {% 
  client.global.set("hoge", response.headers.valuesOf("X-HOGE")[0]);
  client.global.set("hello", response.body.hello);
%}

###
POST http://localhost:8080
Content-Type: application/json

{
  "hello": "{{hello}}",
  "hoge": "{{hoge}}"
}

実行結果

POST処理のjsonには、最初のGETで取得した値が設定されていますね。

hoge = Hoge(hello=world, hoge=fuga)