0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【訂正】RequestHeaderを使わなくても良さそう【備忘】SpringBootでJSONをPOSTする時はRequestHeaderを設定する

Last updated at Posted at 2020-12-11

2020/12/14訂正

私の理解が間違っていました。

なぜか、第3引数で指定する型を、第2引数の型を指定するものだと思っていました。
正確には、第3引数は、戻り値の型を指定するでした。

@PostMapping("/hoge")
fun hoge() : String {
  val uri = "foo"
  val human = Human("30","Nobkov","male")
  // jsonに変換する必要なし
-  val mapper = jacksonObjectMapper()
-  val json = mapper.writeValueAsString(human)
-  val response = restTemplate.postForObject(uri, json, String::class.java) as String
// 「as String」を使わなくても良いが「String?」になっていたので、一応キャスト
+  val response = restTemplate.postForObject(uri, human, String::class.java) as String
  return "index"
}

はじめに

どーも、のぶこふです。
タイトル通りですが、だいぶ躓いたので備忘として残しておきます。
(日本語での解決サイトも特に見当たらなかったので)

もう少し詳細に書くと、ACA-PyのCloudAgentのAPIに対して、Webアプリからリクエストを投げたのですが、まーエラーが返ってきて、なんじゃらほい、といった感じです。
Swaggerからだと問題なく動いたのですが、まったく同じJsonを文字列として投げてもダメだったので、RequestHeaderを設定したら、うまく行ったよ。と言うことです。

なにがおこっていたのか?

SpringBoot+Kotlin+JsonでPostをしようとしたら、次のような記述になると思います。

@PostMapping("/hoge")
fun hoge() : String {
  val uri = "foo"
  val human = Human("30","Nobkov","male")

  val mapper = jacksonObjectMapper()
  val json = mapper.writeValueAsString(human)

  val response = restTemplate.postForObject(uri, json, String::class.java) as String
  return "index"
}

data class Human(
  @JsonProperty("age")
  val age : String = "",
  @JsonProperty("name")
  val name : String = "",
  @JsonProperty("sex")
  val sex : String = "",
)

ところがどっこい、これだと次のようなエラーが発生したのです。

422 Unprocessable Entity: [{"age": ["Missing data for required field."],"name": ["Missing data for required field."],"sex": ["Missing data for required field."]}

「いや、設定しとるわっ!!」

なんやかんやありまして

原因としては、受け手がJSONを要求していたからなのかなーと思いつつ、対応方法は次の通りです。


@PostMapping("/hoge")
fun hoge() : String {
  val uri = "foo"
  val human = Human("30","Nobkov","male")

  val mapper = jacksonObjectMapper()
  val json = mapper.writeValueAsString(human)
+ // setting header
+ val header = HttpHeader()
+ header.contentType = MediaType.APPLICATION_JSON
+ val entity = HttpEntity(json, header)
+ val response = restTemplate.postForObject(uri, entity, String::class.java) as String
- val response = restTemplate.postForObject(uri, json, String::class.java) as String
  return "index"
}

おわりに

やっぱり、調べ物しているより、コード書いているのが良い。

今回はここまでです。
ありがとうございました。

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?