概要
REST APIアプリを作成し、JSONを使用してPOST通信を行う方法についてまとめた。
概要 これから数回にかけてREST APIについて学んだことを載せていく。 今回はREST APIの仕組みとプロジェクト作成方法について紹介する。 尚、RESTとは何かということについては取り扱わない。 仕組み[…]
事前準備
クライアントから送られるJSONを受け取るリクエストクラスの用意と、リソース登録用の処理をサービスクラスに追加する。
リクエストクラス
Resourceクラスとフィールドは同じとなる。
後々、Bean Validation用のアノテーションを追加していく。
ResourceReq.java
package com.example.rest_prototype.web.input;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* REST APIへのリクエストオブジェクト
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResourceReq {
/** ID */
private String id;
/** 名前 */
private String name;
/** とある日付 */
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate hogeDate;
}
サービスクラス
リソース登録用のcreateメソッドを追加する。
ResourceService.java
package com.example.rest_prototype.biz.service;
import java.time.LocalDate;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.stereotype.Service;
import com.example.restprototype.web.resources.Resource;
@Service
public class ResourceService {
/** DBの代わりに仮実装 */
private static Map<String, Resource> tmpDbMap = new ConcurrentHashMap<>();
/**
* 初期化(仮想DB)
*/
static {
var dto1 = new Resource("1", "りんご", LocalDate.of(2025, 2, 1));
var dto2 = new Resource("2", "ごりら", LocalDate.of(2024, 6, 5));
var dto3 = new Resource("3", "らっぱ", LocalDate.of(2023, 5, 10));
// 初期化
tmpDbMap.put(dto1.getId(), dto1);
tmpDbMap.put(dto2.getId(), dto2);
tmpDbMap.put(dto3.getId(), dto3);
}
/**
* IDに紐づくリソースを取得
* @param id
* @return
*/
public Resource find(String id) {
return tmpDbMap.get(id);
}
/**
* リソース登録
* @param resource
*/
public void create(Resource resource) {
tmpDbMap.put(resource.getId(), resource);
}
}
基本的なPOST通信
POSTリクエストに紐づくハンドラメソッドをコントローラーに作成し、REST API クライアントから動作確認を行う。
コントローラー
クライアントから送信されたJSONをリクエスト用オブジェクトで取得し、リソース登録を行う。
Rest02Controller.java
package com.example.rest_prototype.web.controller.rest02;
import java.net.URI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.example.rest_prototype.biz.service.ResourceService;
import com.example.restprototype.web.input.ResourceReq;
import com.example.restprototype.web.resources.Resource;
@Controller
public class Rest02Controller {
/** ビジネスロジック */
@Autowired
private ResourceService service;
/**
* POSTリクエストされたリソースを登録する
* @param req
* @return
*/
@PostMapping(value = "rest02/create")
public ResponseEntity<Void> post(@RequestBody ResourceReq req) {
// リソース登録
var resource = new Resource(req.getId(), req.getName(), req.getHogeDate());
service.create(resource);
// 作成したリソースにアクセスするためのURI
String resourceUri = "http://localhost:8080/rest_prototype/rest01/" + resource.getId();
return ResponseEntity.created(URI.create(resourceUri)).build();
}
}
POSTリクエストを受け付けるアノテーション。
POSTリクエストの内容をオブジェクトにバインドさせるためのアノテーション。
上記のアノテーションを用意することで、POSTされたリクエストボディにあるJSONを、対象のリクエストクラスのフィールドに自動でバインドできる。
レスポンスのヘッダー部とボディ部を保持するオブジェクトを返却する。
上記はボディ部は無し(Void)でヘッダー部情報のみを保持するResponseEntityクラス。
例えばボディ部とヘッダー部を両方返却したい場合、以下のようにレスポンスボディ部に返却したいオブジェクトを設定する。
// 作成したリソースにアクセスするためのURI
String resourceUri = “http://localhost:8080/rest_prototype/rest01/” + resource.getId();
return ResponseEntity.created(URI.create(resourceUri)).build();
HTTPステータス201と、登録済みリソースにアクセスするためのURIを作成して返却する。
ResponseEntityのcreatedメソッドは以下の2つ役割をもつ。
・Locationヘッダー:指定したURIを設定
動作確認
サーバーを起動して、Talend API Testerを使用して動作確認を行う。
Talend API Testerの使用方法については以下を参照。
概要 GUIのツールを使用してシンプルにREAT APIアプリにリクエストを送りたいと思い、Talend API Testerを使用してみた。 いろいろと便利だったため、基本的な使用方法について簡単にまとめた。 事[…]
POSTリクエスト送信
POSTリクエストを送信し、201ステータス且つLocationヘッダーが返却された。
尚、LocationヘッダーのURIにGETリクエストを行うことで、新規登録したリソースを参照することができる。

まとめ
☑ @PostMappingを付与することで、POSTリクエストを受け付ける
☑ @RequestBodyを付与することで、POSTされたボディ部のJSONを対象のオブジェクトにバインドできる
☑ ResponseEntityのcreatedメソッドを呼ぶことで、HTTPステータス201の設定とLocationヘッダーにURIを設定できる