스프링부트 핵심 가이드의 내용을 참고 했습니다.
외부 API CRUD
Spring Boot Initializer 를 통해 Spring 프로젝트 초기 세팅
The Cat API를 활용하여 고양이 이미지를 조회하고, 이미지를 저장하는 Spring Boot Web Application 구현
미리보기
목표
준비사항
external-api:
url: "https://api.thecatapi.com/v1/images/search"
apiKey: "Your Api Key"
-- thymeleaf를 사용하기위한 설정 --
spring:
thymeleaf:
enabled: true
prefix: classpath:/templates/
suffix: .html
@Service
public interface CatService {
public List<CatImage> getCatImages(Long imageNumber);
public FavouriteResDto postCatFavourite(FavouriteDto favouriteDto);
public List<FavouriteImageDto> getCatFavouriteImages(FavouriteImageReqDto favouriteImageReqDto);
public String deleteFavourite(String favourteId);
}
@Service
@RequiredArgsConstructor
public class CatPhotoService implements CatService {
private final RestTemplate restTemplate;
@Value("${external-api.url}")
private String apiUrl;
@Value("${external-api.apiKey}")
private String apiKey;
@Override
public List<CatImage> getCatImages(Long imageNumber) {
URI uri = UriComponentsBuilder
.fromUriString(apiUrl)
.path("/images/search")
.queryParam("limit",imageNumber)
.encode()
.build()
.toUri();
HttpHeaders headers = new HttpHeaders();
headers.set("x-api-key",apiKey);
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<List<CatImage>> responseEntity = restTemplate.exchange(uri,
HttpMethod.GET, entity, new ParameterizedTypeReference<List<CatImage>>() {
});
System.out.println(responseEntity);
return responseEntity.getBody();
}
@Override
public FavouriteResDto postCatFavourite(FavouriteDto favouriteDto) {
URI uri = UriComponentsBuilder
.fromUriString(apiUrl)
.path("/favourites")
.encode()
.build()
.toUri();
RequestEntity<FavouriteDto> requestEntity = RequestEntity
.post(uri)
.header("x-api-key",apiKey)
.body(favouriteDto);
ResponseEntity<FavouriteResDto> responseEntity = restTemplate.exchange(
requestEntity,
FavouriteResDto.class
);
return responseEntity.getBody();
}
@Override
public List<FavouriteImageDto> getCatFavouriteImages(FavouriteImageReqDto favouriteImageReqDto) {
URI uri = UriComponentsBuilder
.fromUriString(apiUrl)
.path("/favourites")
.queryParam("sub_id",favouriteImageReqDto.getSub_id())
.queryParam("page",favouriteImageReqDto.getPage())
.queryParam("limit",favouriteImageReqDto.getLimit())
.encode()
.build()
.toUri();
HttpHeaders headers = new HttpHeaders();
headers.set("x-api-key",apiKey);
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<List<FavouriteImageDto>> responseEntity = restTemplate.exchange(uri,
HttpMethod.GET, entity, new ParameterizedTypeReference<List<FavouriteImageDto>>() {
});
// System.out.println(responseEntity);
return responseEntity.getBody();
}
@Override
public String deleteFavourite(String favourteId) {
URI uri = UriComponentsBuilder
.fromUriString(apiUrl)
.path("/favourites/"+favourteId)
.encode()
.build()
.toUri();
HttpHeaders headers = new HttpHeaders();
headers.set("x-api-key",apiKey);
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<Object> responseEntity = restTemplate.exchange(uri,
HttpMethod.DELETE, entity, new ParameterizedTypeReference<Object>() {
});
if(responseEntity.getStatusCode().equals(HttpStatus.OK)){
return "delete";
}
else{
return "prodlem";
}
}
}
@RestController
@RequiredArgsConstructor
public class CatController {
private final CatPhotoService catPhotoService;
@GetMapping("/api/v1/images")
public List<CatImage> getImages(@RequestParam Long imageNumber){
return catPhotoService.getCatImages(imageNumber);
}
@PostMapping("/api/v1/favourite")
public FavouriteResDto postFavourite(@RequestBody FavouriteDto favouriteDto){
return catPhotoService.postCatFavourite(favouriteDto);
}
@GetMapping("/api/v1/favourite")
public List<FavouriteImageDto> getFavouriteImages(@RequestParam Long page, @RequestParam String limit, @RequestParam String sub_id){
FavouriteImageReqDto favouriteImageReqDto = FavouriteImageReqDto.builder()
.page(0L)
.limit("100")
.sub_id("user-1").build();
return catPhotoService.getCatFavouriteImages(favouriteImageReqDto);
}
@DeleteMapping("/api/v1/favourite")
public String deleteFavourite(@RequestParam String favouriteId){
return catPhotoService.deleteFavourite(favouriteId);
}
}
공식문서에 따르면
" 즐겨찾기에 추가하려면 너가 POST 요청을 통해 './favourites' 엔드포인트로 다음과 같은 정보를 전달해, 그러면 우리가 id 값을 줄게"