뭔짓을 해도 restTemplate으로 multipart/form-data에서 이미지같은 파일을 보낼 수 없는 경우.
자꾸 404만 응답되고 postman에서는 잘되는데 코드로는 잘 안될 때
헤더를 요래조래 해보고 🤯🤯
파일을 여기에 담고 저기에 담아서 보내봐도 안되었던 경우 😰😰
OkHttp를 사용하는 방식으로 바꿔보셔요..
restTemplate은 레거시래요. 저는 몰랐어요.
WebClient를 spring에서는 추천한대요. 근데 이것도 잘 안됐습니다. 일단 급하다면 OkHttp를 써보시면 좋을듯
간단히 사용하는 법만 적겠습니다.
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
버전 여기서 참고
@Configuration
public class HttpClientConfig {
@Bean
public OkHttpClient okHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build();
}
}
호출하기 예시코드
private final ObjectMapper objectMapper;
private final OkHttpClient okHttpClient;
// 메서드
public ApickApiResponse compareImages(MultipartFile baseImage, List<MultipartFile> compareImages) throws IOException {
byte[] baseImageBytes = baseImage.getBytes();
MultipartBody.Builder bodyBuilder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", baseImage.getOriginalFilename(),
RequestBody.create(baseImageBytes, MediaType.parse("image/*")));
compareImage.getOriginalFilename(),
RequestBody.create(compareImage.getBytes(), MediaType.parse("image/*")));
}
Request request = new Request.Builder()
.url(apiUrl)
.header("KEY", apiKey)
.post(bodyBuilder.build())
.build();
try (Response response = okHttpClient.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new BusinessException(ErrorCode.API_CALL_FAILED);
}
assert response.body() != null;
return objectMapper.readValue(response.body().string(), ApickApiResponse.class);
}
}