Home About Contact
Micronaut , Kotlin

プレーンテキスト を POST して プレーンテキスト をオウム返しする ウェブサービス

テスト用に json を POST して json を返す ウェブサービスをつくる において、 クライアントで curl を使ってPOSTするときの指定で Content-Type に application/json を使っていた。 もし単なる plain text ポストしたい場合、plain/text を指定したらどうなるのかと試したらエラーになった。

そこで今回は plain/text を POST して plain/text の結果を得る コントローラを micronaut で書いてみることにした。 言語は groovy に代えて kotlin を使います。

Micronaut

version 確認:

$ mn --version
Micronaut Version: 2.5.6

それではプロジェクトを作成して、item コントローラをつくるところまで:

$ mn create-app myapp --build=gradle --lang=kotlin
$ cd myapp
$ mn create-controller item

生成された雛形の src/main/kotlin/myapp/ItemController.kt を修正します。

package myapp

import io.micronaut.http.annotation.Controller
//import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Post
import io.micronaut.http.annotation.Body
import io.micronaut.http.HttpStatus

@Controller("/item")
class ItemController {
    /*
    // 元のコード
    @Get(uri="/", produces=["text/plain"])
    fun index(): String {
        return "Example Response"
    }
    */

    @Post(uri="/", consumes=["text/plain"], produces=["text/plain"])
    fun index(@Body contents: String): String {
        return contents
    }
}

内容は、POST されてきた文字列をオウム返しするだけです。 POST されるデータを consumes=["text/plain"] でプレーンテキストを指定する、を追加しました。

それではサーバ起動:

$ ./gradlew run

curl で POST します。 最初は Content-Type に application/json を指定してみます。

$ curl -X POST "http://localhost:8080/item/" -d 'hello' -H "Content-Type: application/json"
{"message":"Content Type [application/json] not allowed. Allowed types: [text/plain]","_links":{"self":{"href":"/item/","templated":false}}}

うまくいきません。

それでは Content-Type に text/plain を指定してみます。

$ curl -X POST "http://localhost:8080/item/" -d 'hello' -H "Content-Type: text/plain"
hello

うまくいきました。

つまり、前回 のコードでは、consumes=["application/json"] の指定が暗黙になされていた、ということかな。 (指定しないとデフォルトが application/json になるということ)