Skip to content

SwiftでSpringBootで作られたAPIに文字列を渡す

   

SwiftでSpringBootで作られたAPIに文字列を渡した時にちょっと詰まったのでそれの忘備録です。

@RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public SampleBean request(@RequestBody String text) {
        SampleBean sampleBean = new SampleBean();
        sampleBean.setText(text);
        return sampleBean;
    }
@Data
public class SampleBean implements Serializable {
    private String text;
}

このような Bean を返すエンドポイントを作りました。curl コマンドでエンドポイントを叩くと以下のようなレスポンスが返ってきます。想定通りの挙動です。

curl "http://localhost:8080/sample" \
  -X POST \
  -H 'Content-Type: application/json' \
	-d 'Kabigon' \
  | jq
{
  "text": "Kabigon"
}

次にこのエンドポイントを Swift から叩きます。

レスポンスを SampleBean にデコードしてその中の text プロパティを表示すると ダブルクオート付きの文字列が表示されてしまいます。 それはSwift がダブルクオートを含めて Spring 側にデータを送信しているからです。 Swiftが行っているリクエストを curl コマンドに翻訳すると以下になります。

curl "http://localhost:8080/sample" \
	-X POST \
	-H 'Content-Type: application/json' \
	-d '"Kabigon"'

将来的に送りたいプロパティが増えるので、Swiftから String 型ではなく、任意の struct を送信するようにしました。

curl "http://localhost:8080/sample" \
	-X POST \
	-H 'Content-Type: application/json' \
	-d '{"text":"Kabigon"}'

関連記事

  1. SpringBootでBeanを返すとプロパティ名のisが省略される
  2. IntelliJでJavaのGradleのプロジェクトを作成する
  3. Spring InitializrでアプリをSpringアプリを作成する
  4. Swiftで数字が連番になった配列を作成する
  5. TableViewでセルのロングタップを検出する
  6. UIAlertControllerの中でTextFieldを使い、文字数を制限する
  7. UIAlertControllerの中でTextFieldを使う