API呼ぶ【準備編】

##API呼ぶ

以下4つのパートに分かれています。(〇〇編は適当につけましたゆるして)
API呼ぶ【準備編】
[API呼ぶ【コア編】](https://qiita.com/RO018/private/19a9f1740e0dffbb7844)
[API呼ぶ【ハンドリング編】](https://qiita.com/RO018/private/609ce3dcb3079d44b69a)
[API呼ぶ【コール編】](https://qiita.com/RO018/private/1c9f4e603cd15b95acea)

##準備編
まずは必要なモデル、Json変換、自作Exceptionを用意します。

- モデル：リクエスト/レスポンスを入れる箱
- Json変換：API通信用にリクエスト/レスポンスをJsonに変換する
- Exception：結果に応じたExceptionを作り、処理の分岐の準備をする


###モデル
Getter/Setterは省略してます

```リクエスト.java
package model;

public class RequestDto {
	
	/** 外枠 */
	private RequestBody request;
}
```

```リクエスト中身.java
package model;

public class RequestBody {
	
	/** id */
	private String id;
	/** 名前 */
	private String name;
	/** 内容 */
	private String info;
}
```

```レスポンス.java
package model;

public class ResponseDto {

	/** 処理結果 */
	private String resultCode;
	/** 内容 */
	private ResponseBody body;
}
```

```レスポンス中身.java
package model;

public class ResponseBody {
	
	/** 結果内容 */
	private String info;
	/** コメント */
	private String comment;
}
```


###Json変換
```JsonUtil.java
package json;

import model.RequestDto;
import model.ResponseBody;
import model.RequestBody;
import model.ResponseDto;

public class JsonUtil {
	
	/**
	 * リクエストDTOをJsonに変換
	 * 
	 * @param request リクエストDTO
	 * @return Json変換した文字列
	 */
	public static String requestDtoToJson(RequestDto request) {
		
		RequestBody body = request.getRequest();
		
		String json = 
				"{" + 
					"\"request\": {" + 
						"\"id\": " + body.getId() + "," + 
						"\"name\": " + body.getName() + "," + 
						"\"info\": " + body.getInfo() + 
					"}" + 
				"}";
		
		return json;
	}
	
	/**
	 * レスポンスJsonをDTOに変換
	 * 
	 * @param json レスポンスJson
	 * @return 変換したDTO
	 */
	public static ResponseDto responseJsonToDto(String json) {
		
		json = 
				"{" +
					"\"resultCode\": 0," +
					"\"body\": {" +
						"\"info\": 結果内容これだよ('ω')," +
						"\"comment\": コメントだよ('ω')" +
					"}" +
				"}";
		
		ResponseBody body = new ResponseBody();
		body.setInfo(getContent(json, "info"));
		body.setComment(getContent(json, "comment"));
		ResponseDto response = new ResponseDto();
		response.setBody(body);
		response.setResultCode(getContent(json, "resultCode"));
		
		return response;
	}
	
	/**
	 * Json文字列から情報を切り出す
	 * <p>
	 * XXX 内容にresultCodeの文字列やカンマが入っている場合だめだよねこれｗ
	 * 
	 * @param json Json文字列
	 * @param content 切出し対象のパラメータ名
	 * @return 切出した値
	 */
	private static String getContent(String json, String content) {
		return json.split("\"" + content + "\": ")[1].split(",")[0].split("}")[0].trim();
	}
}
```
レスポンスのとこはやりやすさ重視ってことで、今回は固定値を入れなおしてます。
まぁライブラリがあると思うのでこれはぶっちゃけ必要ないかも？

###自作Exception
```基底Exception.java
package exception;

public class NantokaApiException extends Exception{

	private static final long serialVersionUID = 1L; 
	
	public NantokaApiException(String msg){
		super(msg);
	}
}
```

```予期せぬエラー系をまとめるException.java
package exception;

public class NantokaApiUnknownException extends NantokaApiException {

	private static final long serialVersionUID = 1L; 
	
	public NantokaApiUnknownException(String msg){
		super(msg);
	}
}
```

```API処理結果はあるけどエラー結果だったときのException.java
package exception;

public class NantokaApiBadResultException extends NantokaApiException {

	private static final long serialVersionUID = 1L; 
	
	public NantokaApiBadResultException(String msg){
		super(msg);
	}
}
```

ということで下準備でした
次回こいつらを使ってAPIをたたいていきます