Develop/JAVA

[Java] GET POST 메서드 REST API 호출 서비스 만들기

issuemaker99 2024. 9. 25. 19:15
728x90

Java에서 REST API 호출을 위한 GET 및 POST 방식을 지원하고, 파라미터를 JSON 형태로 넘길 수 있는 함수

 

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.time.Duration;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper; // Jackson 라이브러리 사용

public class RestApiClient {

    private static final HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .build();

    // GET과 POST 메소드를 지원하는 함수
    public static String sendRequest(String url, String method, Map<String, Object> params) throws Exception {
        // JSON 변환을 위한 ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonParams = objectMapper.writeValueAsString(params);
        
        HttpRequest request;

        // GET 요청 처리
        if ("GET".equalsIgnoreCase(method)) {
            URI uri = new URI(url + "?" + getParamsString(params));
            request = HttpRequest.newBuilder()
                    .uri(uri)
                    .GET()
                    .timeout(Duration.ofSeconds(10))
                    .header("Content-Type", "application/json")
                    .build();
        } 
        // POST 요청 처리
        else if ("POST".equalsIgnoreCase(method)) {
            request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .POST(BodyPublishers.ofString(jsonParams))
                    .timeout(Duration.ofSeconds(10))
                    .header("Content-Type", "application/json")
                    .build();
        } else {
            throw new IllegalArgumentException("Unsupported HTTP method: " + method);
        }

        // 서버로 요청 전송
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

        // 상태 코드와 응답 본문 반환
        if (response.statusCode() == 200) {
            return response.body();
        } else {
            throw new Exception("HTTP error: " + response.statusCode() + " - " + response.body());
        }
    }

    // GET 요청 시, 파라미터를 URL 쿼리스트링으로 변환하는 함수
    private static String getParamsString(Map<String, Object> params) {
        StringBuilder result = new StringBuilder();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            result.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }
        String resultString = result.toString();
        return resultString.length() > 0 ? resultString.substring(0, resultString.length() - 1) : resultString;
    }

    public static void main(String[] args) {
        try {
            // 예시 GET 요청
            String getResponse = sendRequest("https://api.example.com/getData", "GET", Map.of("param1", "value1", "param2", "value2"));
            System.out.println("GET Response: " + getResponse);

            // 예시 POST 요청
            String postResponse = sendRequest("https://api.example.com/postData", "POST", Map.of("param1", "value1", "param2", "value2"));
            System.out.println("POST Response: " + postResponse);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

주요 설명

  1. HttpClient: Java 11에 도입된 새로운 HTTP 클라이언트로, 비동기 및 동기 방식의 HTTP 요청을 지원합니다.
  2. GET 및 POST 방식 선택: 요청 방식을 GET 또는 POST로 선택할 수 있으며, 그에 따라 요청을 다르게 처리합니다.
  3. JSON 파라미터 전송: Jackson 라이브러리를 사용해 Map<String, Object> 형태의 파라미터를 JSON 문자열로 변환하여 전송합니다.
  4. 타임아웃 설정: 각 요청에 대해 타임아웃을 10초로 설정하였습니다.

의존성 (Jackson)

이 코드를 실행하려면 Jackson 라이브러리를 추가해야 합니다. Maven 프로젝트일 경우 pom.xml에 아래와 같은 의존성을 추가합니다

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

 

LIST