質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

13921閲覧

SpringBootのREST APIで、curlでJSONを送ると415エラー(Unsupported Media Type)

666_paru

総合スコア20

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/10/16 03:21

Kotlinサーバーサイド実践開発という本のREST APIの実装部分を行っております。

以下を記載し、動作させ、curlコマンドでJSONを送り、JSONが返る想定ですがエラーが返ります。

Kotlin

1@RestController 2@RequestMapping("greeter") 3class GreeterController { 4 // JSONでリクエストを受け取る 5 @PostMapping("/hello") 6 fun helloByPost(@RequestBody request: HelloRequest): HelloResponse { 7 return HelloResponse("Hello ${request.name}") 8 } 9 10 // リクエストリングでリクエストを受け取る 11 @GetMapping("/hello") 12 fun hello(@RequestParam("name") name: String): HelloResponse { 13 return HelloResponse("Hello ${name}") 14 } 15}

Kotlin

1data class HelloRequest(val name: String)

Kotlin

1data class HelloResponse(val message: String)

コマンドプロンプトで実行したコマンド

curl -H 'Content-Type:application/json' -X POST -d '{"name":"Kotlin"}' http://localhost:8080/greeter/hello

返ってきたエラーメッセージ

{"timestamp":"2021-10-16T02:49:19.075+00:00","status":415,"error":"Unsupported Media Type","message":"","path":"/greeter/hello"}

intellijでのログ

12021-10-16 12:07:24.097 WARN 13840 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported] 2

hello()は想定通りの動作をしており、URLの間違いはなさそうです。
エラーで調べていくと、
Content-Type: application/jsonとapplicationの前にスペースが入る、'と"が違う、など多少の表記揺れがあり、試してみましたが結果は変わりませんでした。
コマンドプロンプトの設定はshift-JISでしたので、サポートしていないと出ているUTF-8でないので、ここが原因ではないかと思っています。
Windows10で、intellijで作成していますが、本の作者はMacで行っているそうです。

お手数おかけしますが、原因、解決方法お判りになりませんでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/16 05:00

Fiddler などのパケットキャプチャツールを使って要求・応答を調べてみませんか。要求ヘッダが Content-Type:application/json になっているかどうかとか。エラーメッセージを見ると application/x-www-form-urlencoded;charset=UTF-8 になっているように見えますけど。
666_paru

2021/10/16 13:53

ありがとうございます。 原因がわかりまして、ダブルクォーテーションにエスケープが必要でした。 Fiddlerを知らなかったため、今度から使用して検証してみます。 教えて頂き、ありがとうございます。
guest

回答2

0

Fiddler の Composer を使ってはいかがですか?

このように URL、POST メソッド、Content-Type、送信する JSON 文字列を設定して Execute ボタンをクリックするれば送信されます。

イメージ説明

結果の要求・応答は Inspectors タブをクリックして見ることができます。

イメージ説明

投稿2021/10/16 07:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

666_paru

2021/10/16 13:51

Fiddler の Composerというものは知りませんでした。教えて頂きありがとうございます。 先ほど今回の原因がわかりまして、ダブルクォーテーションにエスケープが必要なためエラーになっておりました。 この調べ方には今後もお世話になると思います。教えて頂きありがとうございます!
退会済みユーザー

退会済みユーザー

2021/10/16 21:56 編集

Fiddler が開発に有用なのは Composer の機能だけでなく、2 枚目の画像にある要求・応答の内容が分かることです。curl、ブラウザ、自作アプリなど HTTP 通信を行うクライアントなら何でもキャプチャできます。トラブルがあったとき要求・応答が分からないと解決できないことも多々あります。是非導入されることをお勧めします。 今回のトラブルも 2 枚目の画像の要求を見れば原因がすぐ分かったと思います。(curl で Fiddler を使うには、curl のオプションでプロキシを通すようにすればキャプチャしてくれます)
KT001

2021/10/17 01:20

Fiddler良いツールですよね。Spring Boot+ RESTの開発現場だと、PostmanやSwagger UIがよく使われています。 https://stackshare.io/stackups/fiddler-vs-postman-vs-swagger-ui Postmanはシェアが高いのと、Spring BootだとSwagger UIは依存関係に追加するだけで使えてしまうので便利です。 いずれにしても、Fiddler、Postman、Swagger UIはとても良いツールだと思います。
guest

0

ベストアンサー

Windowsであれば、ダブルクォーテーションを使うので、以下で取得できます。(掲載して頂いたSpring Boot + Kotlinのコードも、動作することを確認しました)

curl -H "Content-Type:application/json" -X POST -d "{\"name\":\"Kotlin\"}" http://localhost:8080/greeter/hello

投稿2021/10/16 06:31

編集2021/10/16 07:27
KT001

総合スコア659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

666_paru

2021/10/16 13:47

教えて頂きありがとうございます! ダブルクォーテーションにしてエスケープが必要だったのですね。 動作することを確認できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問