スマートデバイスアプリ開発のあれやこれや

Spring BootでJSONデータを受け付けるWebAPIを作る

前回の記事の続きモノです。

niwaka.hateblo.jp

↑の記事で、POSTでリクエストパラメータを受け付けるWebAPIを
Spring Bootでサクッと作る方法をまとめてみましたが、今度は
リクエストをJSON形式で受け取る方法を整理してみます。
(前回の記事から続きで実装する体で進めます......!)

環境は以下の通りです。

1. Controllerクラスのメソッドをいじる(1)

前回、↓のようなControllerクラスを作りました。

@Controller
@EnableAutoConfiguration
public class SampleController {
	
	@RequestMapping("/service")
	@ResponseBody
	public List<String> top() {
		List<String> list = new ArrayList<String>();
		list.add("太宰");
		list.add("夏目");
		return list;
	}

このControllerクラスのtopメソッドを改造していきます。
いじるポイントは2つ。

  • @RequestMappingにconsumesを追加する
  • 引数でJSONデータをパース後にバインドするクラスを設定する


既存の@RequestMappingアノテーションに設定を追加します。
前回『メソッドに紐付いたURL』の設定を@RequestMappingで行うと書きましたが
実際のところはURLの紐付け設定だけでなく、受け取るデータ種別の設定も可能です。
今回は受け取るデータ種別としてJSONデータを受け取れるように設定します。
具体的には以下のような感じになります。

@Controller
@EnableAutoConfiguration
public class SampleController {
	
	@RequestMapping(value="/service",consumes=MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public List<String> top() {
		List<String> list = new ArrayList<String>();
		list.add("太宰");
		list.add("夏目");
		return list;
	}

前回書いていた『@RequestMapping("/service")』という部分は
省略せずに書くと『@RequestMapping(value="/service")』となります。
value以外にも設定は在って、今回はconsumesで受け取るデータ種別を設定しています。
(※前回、今回と省略してますが、戻るデータ種別を定義するproducesという項目も在ります)

2. JSONのデータを保持するクラスを作る

続いてリクエストで受け取ったJSONがバインドされるクラスを作ります。
Spring Boot(=Spring MVC)では、JSON形式のデータを受け付けた後、
対応するクラスにデータをバインドして渡してくれます。

今回は適当に↓のようなクラスを作りました。

public class SampleBean implements Serializable {

	private static final long serialVersionUID = 1L;
		
	private String name;

	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}	
}

3. Controllerクラスのメソッドをいじる(2)

またControllerクラスに戻ってきます。
ステップ2で作成したクラスとJSONマッピングするように再度
Controllerクラスを弄っていきます。

@Controller
@EnableAutoConfiguration
public class SampleController {
	
	@RequestMapping(value="/service",consumes=MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public List<String> top(@RequestBody SampleBean bean) {
		List<String> list = new ArrayList<String>();
		list.add("太宰");
		list.add("夏目");
		return list;
	}

topメソッドの引数に@RequestBodyアノテーション付きの引数を追加しました。
引数の型は先ほど作ったSampleBeanクラスです。
この設定を付与することでbeanインスタンスJSONデータがマッピングされます。
bean.getName()の結果をコンソール出力する処理を追記して試してみましょう。

4. 実際にリクエストしてみる

動いているか検証してみます。
以下のようなJavaScriptで検証できると思います。

    // 各フィールドから値を取得してJSONデータを作成
    var data = {
        "name": "hoge",
    };
    
    // 通信実行
    $.ajax({
        type:"post",                
        url:"http://localhost:8080/services",        
        data:JSON.stringify(data), 
        contentType: 'application/json', 
        dataType: "json",           
        success: function(json_data) {   
          // 成功時の処理
        }
    });