はじめに
こんにちは!さいけです。
本記事は、「SpringBootでwebAPI(JSON)をコールして結果をJSONレスポンスで返却する方法」について紹介します。
前提
- 利用するWebAPIは、以下の天気APIです。
- なお、お天気APIのリクエスト・レスポンスの仕様については割愛します。
- http://weather.livedoor.com/weather_hacks/webservice
- IntelliJ IDEAでLombokが有効設定になっている
- build.gradleもしくはpom.xmlに「org.projectlombok:lombok」が追加されている
開発環境
- Java8
- IntelliJ IDEA
- SpringBoot 2.1.3.RELEASE
SpringBootでwebAPI(JSON)をコールして結果をJSONレスポンスで返却する方法
webAPIをコールしてJSONレスポンスを返却する方法を以下のクラスで追って解説していきます。
- Controller
- ApiClient
- Entity
- Response
Conttollerクラス
@RestController
@RequiredArgsConstructor
public class WeatherController {
private final WeatherApiClient weatherApiClient;
@GetMapping(value = "/weather")
public WeatherResponse getWeather(@RequestParam("city") int city) {
WeatherEntity weatherEntity = weatherApiClient.getWeather(city);
return new WeatherResponse(
weatherEntity.getTitle(),
weatherEntity.getDescription().getText());
}
}
Conttollerクラスの解説
- RestControllerクラス
- @RequestParamで外部から値を受け取り、その値をApiClientに渡してあげて、返却値をWeatherResponseに詰めてレスポンスとして返却しています
- また、DI注入を行い、WeatherApiClientを利用可能にしています
- DI注入する際は@RequiredArgsConstructorが必須になります
Responseクラス
@Getter
@AllArgsConstructor
public class WeatherResponse {
private String title;
private String description;
}
Responseクラスの解説
- RestControllerが返却するレスポンス値を保持するクラス
- titleとdescriptionのパラメータが保持できます
ApiClientクラス
@Component
@RequiredArgsConstructor
public class WeatherApiClient {
private RestTemplate restTemplate = new RestTemplate();
public WeatherEntity getWeather(int city) {
return restTemplate.getForObject(
"http://weather.livedoor.com/forecast/webservice/json/v1?city=" + city,
WeatherEntity.class
);
}
}
ApiClientクラスの解説
- お天気APIを叩くクラス
- @ComponentでSpringBootにクラスの存在を知らせています(噛み砕いた表現を使っています)
- RestTemplateをDI注入して利用可能にしています
- restTemplateのgetForObjectメソッドを利用してお天気Apiを叩きます
- Apiを叩いた結果をWeatherEntityクラスに値を渡します
Entityクラス
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class WeatherEntity {
@JsonProperty("title")
private String title;
@JsonProperty("description")
private WeatherEntity.Description Description;
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Description {
@JsonProperty("text")
private String text;
}
}
Entityクラスの解説
- お天気APIをコールした値を保持するクラス
- @JsonPropertyを使って、お天気APIのJSON結果をそれぞれの値にマッピングしています
JSONが返却されているか見てみる
curlでリクエストしてみます。
$ curl localhost:8080/weather?city=130010
以下のような、titleとdescriptionが含まれるJSONレスポンスが返却されています。
{"title":"東京都 東京 の天気","description":" 低気圧が伊豆諸島付近と四国の南にあって、それぞれ東へ進んでいます。\n\n 東京地方は、雨となっています。\n\n 3日は、伊豆諸島付近にある低気圧の影響で雨となるでしょう。伊豆諸島\nでは、雷を伴う所がある見込みです。\n\n 4日は、別の低気圧が西日本の南岸を東へ進んで次第に弱まりますが、午\n後は上空に寒気を伴った気圧の谷が通過するでしょう。このため、雨となる\n見込みです。伊豆諸島では雷を伴う所があるでしょう。\n\n【関東甲信地方】\n 関東甲信地方は、雨や曇りとなっています。\n\n 3日は、低気圧の影響で雨となり、標高の高い所は雪が混じるでしょう。\n伊豆諸島では、雷を伴う所がある見込みです。\n\n 4日は、別の低気圧が西日本の南岸を東へ進んで次第に弱まりますが、午\n後は上空に寒気を伴った気圧の谷が通過するでしょう。このため、雨で標高\nの高い所は雪となる見込みです。伊豆諸島では雷を伴う所があるでしょう。\n\n 関東地方と伊豆諸島の海上では、4日にかけてうねりを伴って波が高い見\n込みです。船舶は高波に注意してください。"}
おわりに
DI注入やLombokのアノテーションについては、今回は具体的に触れませんでしたが、どちらもSpringBootを扱う上では知っておかなければいけない知識なので、ぜひ調べてみてください!
コメント