テスト用に json を POST して json を返す ウェブサービスをつくる において、 クライアントで curl を使ってPOSTするときの指定で Content-Type に application/json を使っていた。 もし単なる plain text ポストしたい場合、plain/text を指定したらどうなるのかと試したらエラーになった。
そこで今回は plain/text を POST して plain/text の結果を得る コントローラを micronaut で書いてみることにした。 言語は groovy に代えて kotlin を使います。
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 になるということ)