今回は、「SAStruts(Super Agile Struts)」のアクションクラスで「JSON(JavaScript Object Notation)」のリクエスト/レスポンスの処理する方法を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- SAStruts
- バージョン:1.0.4-sp9
- S2Container
- バージョン:2.4.48
- Jackson
- バージョン:2.13.1
「Jackson」は、「JSON」を扱うためライブラリとして使用します。プロジェクトの状況により他のライブラリを選択することも可能です。
処理方法
「JSON」のリクエスト/レスポンスを処理する方法は、次のようになります。
リクエストクラス
「JSON」をリクエストオブジェクトに変換するためのクラスは、次のようになります。
package com.fumidzuki.sastruts.dto;
public class ExampleRequest {
public String id;
public String name;
}
作成したクラスで利用できるリクエスト情報は、次のようになります。
{
"id": 10,
"name": "hoge"
}
レスポンスクラス
レスポンスオブジェクトを「JSON」に変換するためのクラスは、次のようになります。
package com.fumidzuki.sastruts.dto;
public class ExampleResponse {
public String status;
}
作成したクラスで利用できるレスポンス情報は、次のようになります。
{
"status": "ok"
}
アクションクラス
リクエスト/レスポンス処理を実施するアクションクラスは、次のようになります。
package com.fumidzuki.sastruts.action;
import javax.servlet.http.HttpServletRequest;
import org.seasar.framework.util.ReaderUtil;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.RequestUtil;
import org.seasar.struts.util.ResponseUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fumidzuki.sastruts.dto.ExampleRequest;
import com.fumidzuki.sastruts.dto.ExampleResponse;
public class IndexAction {
@Execute(validator = false)
public String index() throws Exception {
ObjectMapper mapper = new ObjectMapper();
HttpServletRequest request = RequestUtil.getRequest();
String requestBody = ReaderUtil.readText(request.getReader());
ExampleRequest exampleRequest = mapper.readValue(requestBody, ExampleRequest.class);
System.out.printf("ID:%s, name:%s", exampleRequest.id, exampleRequest.name);
ExampleResponse exampleResponse = new ExampleResponse();
exampleResponse.status = "ok";
String responseBody = mapper.writeValueAsString(exampleResponse);
ResponseUtil.write(responseBody, "application/json", "utf-8");
return null;
}
}
リクエスト情報の取得
リクエスト情報の取得は、次の処理で実施しています。
HttpServletRequest request = RequestUtil.getRequest();
String requestBody = ReaderUtil.readText(request.getReader());
「RequestUtil.getRequest」メソッドを使用してリクエスト情報を取得します。「ReaderUtil.readText」メソッドにリクエスト情報を指定することで、リクエスト情報の「メッセージボディ」を文字列として取得できます。
リクエスト情報からオブジェクトへの変換
「JSON」文字列からオブジェクトへの変換は、次の処理で実施しています。
ExampleRequest exampleRequest = mapper.readValue(requestBody, ExampleRequest.class);
「ObjectMapper.readValue」を使用して、「JSON」文字列をオブジェクトに変換できます。
レスポンス情報の作成
レスポンス情報の作成は、次の処理で実施しています。
ExampleResponse exampleResponse = new ExampleResponse();
exampleResponse.status = "ok";
String responseBody = mapper.writeValueAsString(exampleResponse);
レスポンス情報のオブジェクトを作成して「ObjectMapper.writeValueAsString」を使用して、「JSON」文字列を取得できます。
レスポンス情報の返却
レスポンス情報の返却は、次の処理で実施しています。
ResponseUtil.write(responseBody, "application/json", "utf-8");
return null;
「ResponseUtil.write」メソッドを使用してレスポンス情報を返却します。また、このタイミングでレスポンス情報は返却済みのため、戻り値は「null」を指定します。
実行例
リクエストの実行例は、次のようになります。
【実行方法】
リクエストは「curl」コマンドで実行しています。
$ curl -X POST -H "Content-Type: application/json" -d "{\"id\":\"10\", \"name\":\"hoge\"}" http://localhost:8080/
【実行結果】
レスポンス情報に指定した情報が「JSON」文字列で取得できることを確認できます。
{"status":"ok"}
まとめ
「SAStruts」を使用して「JSON」のリクエスト/レスポンスの処理を実施する方法を紹介しました。