JAVA

스프링부트 httpClient 를 이용한 외부 API 통신하기

dodo1054 2024. 1. 4. 10:15
반응형
스프링 부트 1.5.9.RELEASE 버전이라서 httpClient 사용진행 
참고로, Apache HttpClient는 Java 11부터는 deprecated 되어
Java 11 이상의 버전에서는 java.net.http.HttpClient를 사용하는 것이 권장
2.x  이상의 경우는 webClient 사용권장

 

1. 의존성 추가하기 ( 테스트 코드는 밑에 있음)

Maven Pom.xml

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>


Gradle build.gradle

dependencies {
    implementation 'org.apache.httpcomponents:httpclient:4.5.13'
}

 

2. HttpClient 인스턴스 생성

CloseableHttpClient httpClient = HttpClients.createDefault();

 

3. Http 요청 구성하기

Get
HttpGet httpGet = new HttpGet("http://example.com/api/resource");

Post
HttpPost httpPost = new HttpPost("http://example.com/api/resource");
httpPost.setEntity(new StringEntity("request body"));

header (옵션)
httpGet.addHeader("Authorization", "Bearer your_token");

 

4. 요청실행

CloseableHttpResponse response = httpClient.execute(httpGet);

 

5. 응답처리

try {
    int statusCode = response.getStatusLine().getStatusCode();
    HttpEntity entity = response.getEntity();
    String responseBody = EntityUtils.toString(entity);

    // 응답 처리 로직 작성
    // statusCode, responseBody 등을 활용
} catch(Exception e) {

}
finally {
    response.close();
}

 

6. httpClient 인스턴스 닫기

httpClient.close();

 

 

- 요청 테스트 최종 코드 

인터페이스 및 서비스 단만 처리 

인터페이스
public interface SendMessage {
    returnCode sendMessageService(String sendId, String sendName, List<String> receiveIds, String sendTitle, String sendMessage) throws Exception;
}

서비스
@Service
public class SendMessageServiceImpl implements SendMessage {
  
    @Override
    public returnCode sendMessageService(String sendId, String sendName, List<String> receiveIds, String sendTitle, String sendMessage) throws Exception {

        returnCode returnCode = returnCode.SUCCESS;

        String sendDNS = "http://test.com";
        String testURL = "http://127.0.0.1:8080/views/test/testURL.jsp";

        //HttpClient 인스턴스 생성하기
        CloseableHttpClient httpClient = HttpClients.createDefault();

        URIBuilder uriBuilder = new URIBuilder(testURL);

        sendId      = (sendId == null)      ? "testId"        : sendId;
        sendName    = (sendName == null)    ? "testName"      : sendName;
        sendTitle   = (sendTitle == null)   ? "testTitle"     : sendTitle;
        sendMessage = (sendMessage == null) ? "testMessage"   : sendMessage;

     
        uriBuilder.setParameter("sendId", sendId);
        uriBuilder.setParameter("sendName", sendName);

        StringBuilder receiveIdBuilder = new StringBuilder();

		// receiveIds 를 여러개 받아 처리 (리스트사용)
		//receveId 가 여러개이기 때문에 ; 로 구분하기 위함
        for (String receiveId : receiveIds) {
            if (receiveIds.size() > 1) {
                receiveIdBuilder.append(receiveId).append(";");
            } else {
                receiveIdBuilder.append(receiveId);
            }
        }

        String appendReceiveIds = String.valueOf(receiveIdBuilder);

        if (!appendReceiveIds.isEmpty()) {
            if (receiveIds.size() > 1) {
                appendReceiveIds = appendReceiveIds.substring(0, appendReceiveIds.length() - 1);
            }
            uriBuilder.setParameter("receiveId", appendReceiveIds);
        }

        uriBuilder.setParameter("sendTitle", sendTitle); 
        uriBuilder.setParameter("sendMessage", sendMessage);

        URI uri = uriBuilder.build();

        //System.out.println("URI : " + uri);
        HttpGet httpGet = new HttpGet(uri);

        //System.out.println("HTTPGET : " + httpGet);
        //요청 실행
        CloseableHttpResponse response = httpClient.execute(httpGet);

        try {
            //응답 상태 코드 확인
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                String responseString = EntityUtils.toString(entity, "UTF-8");
                System.out.println(responseString);
            } else {
                returnCode = returnCode.INVALID_DATA;
            }
        } catch (Exception e) {

        } finally {
            //응답 및 httpClient close
            response.close();
            httpClient.close();
        }

        return returnCode;
    }

}

 

- 응답 테스트 testURL.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>받은 데이터</h1>
<p>보내는 ID: <%= request.getParameter("sendId") %></p>
<p>보내는 이름: <%= request.getParameter("sendName") %></p>
<p>받는 ID: <%= request.getParameter("receiveId") %></p>
<p>보내는 제목: <%= request.getParameter("sendTitle") %></p>
<p>보내는 메시지: <%= request.getParameter("sendMessage") %></p>
</body>
</html>
반응형