Language/Java

[springboot] HTTP 요청 (REST API) 참고용

도토리즈 2023. 7. 10. 23:35

python으로 겁나 간단하게 requests 사용해서 http요청 하다가 스프링으로 할라니까

살..짝 ^^ (사실 많이) 헷갈려서 참고용으로 포스팅 

 

 

-- 사용예정 : Spring RestTemplate 

 

1. map 사용 (고정값)

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

public class HttpClientExample {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();

        // Request 헤더 설정
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // Request body 데이터 설정
        MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
        requestBody.add("key", "value");
        MultiValueMap<String, Object> requestBody2 = new LinkedMultiValueMap<>();
        requestBody2.add("key1", value1);
        requestBody2.add("key2", value2);
        requestBody2.add("key3", value3);
        requestBody.add("requestBody2", requestBody2);

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);

        // API 엔드포인트 URL
        String url = "http://127.0.0.0:1111/요청할 주소";

        // POST 요청 보내기
        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);

        // HTTP 응답 코드 확인
        int responseCode = response.getStatusCodeValue();
        System.out.println("Response Code: " + responseCode);

        // HTTP 응답 본문 읽기
        String responseBody = response.getBody();
        System.out.println("Response: " + responseBody);
    }
}

 

 

2. 클래스 생성하여 사용 (고정값)

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

public class HttpClientExample {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();

        // Request 헤더 설정
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // Request body 데이터 설정
        ObjectMapper objectMapper = new ObjectMapper();
        String requestBody;
        try {
            Data requestData = new Data();
            requestData.setKey("value");
            Data2 requestData2 = new Data2();
            requestData2.setKey1(value1);
            requestData2.setKey2(value2);
            requestData2.setKey3(value3);
     
            requestData.setData2(requestData2);

            requestBody = objectMapper.writeValueAsString(requestData);
            
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return;
        }

        HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);

        // API 엔드포인트 URL
        String url = "http://127.0.0.0:1111/요청할 주소";

        // POST 요청 보내기
        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);

        // HTTP 응답 코드 확인
        int responseCode = response.getStatusCodeValue();
        System.out.println("Response Code: " + responseCode);

        // HTTP 응답 본문 읽기
        String responseBody = response.getBody();
        System.out.println("Response: " + responseBody);
    }

여기서 Data 클래스와 Data2 클래스는 따로 생성하고 lombok을 이용해서 getter ,setter 생성해줘야함 

 

 

3. api로 전달받는 데이터 사용 

여기선 내가 참고해야 할 데이터 그대로 사용함 !

@PostMapping("/my-api")
    public ResponseEntity<String> myApiMethod(@RequestBody MyRequestData requestData) {
    
        // Request 헤더 설정
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // Request body 데이터 설정
        MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
        requestBody.add("table_name", requestData.getTableName());
        MultiValueMap<String, Object> partition = new LinkedMultiValueMap<>();
        partition.add("year", requestData.getPartition().getYear());
        partition.add("month", requestData.getPartition().getMonth());
        partition.add("day", requestData.getPartition().getDay());
        requestBody.add("partition", partition);

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);

        // API 엔드포인트 URL
        String url = "http://127.0.0.0:1111/요청할 주소";

        // POST 요청 보내기
        ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);

        // HTTP 응답 반환
        return response;
    }

-- MyRequestData Class 

@Data
public class MyRequestData {
    private String table_name;
    private Partition partition;
}

-- Partition Class

 @Data
 public static class Partition {
        private int year;
        private int month;
        private int day;

}

응답 반환 전에 꼭 status 코드 체크 하기 !

 

 

-- 기타 라이브러리

 

① OkHttp

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import java.io.IOException;

public class HttpClientExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        // Request body 데이터 설정
        String requestBody = "{"key":"value", "key2":"value2" , "key3" :"value3" }";
        RequestBody requestEntity = RequestBody.create(MediaType.parse("application/json"), requestBody);

        // Request 생성
        Request request = new Request.Builder()
                .url("http://127.0.0.0:1111/요청할 주소")
                .post(requestEntity)
                .build();

        try (Response response = client.newCall(request).execute()) {
            // HTTP 응답 코드 확인
            int responseCode = response.code();
            System.out.println("Response Code: " + responseCode);

            // HTTP 응답 본문 읽기
            String responseBody = response.body().string();
            System.out.println("Response: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

② Apache HttpClient

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class HttpClientExample {
    public static void main(String[] args) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://127.0.0.1:1111/output/getOutput");

        // Request body 데이터 설정
        String requestBody = "{\"key\":\"value\",\"key2\":\"value2\",\"key3\":\"value3\"}";
        StringEntity requestEntity = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
        httpPost.setEntity(requestEntity);

        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
            // HTTP 응답 코드 확인
            int responseCode = response.getStatusLine().getStatusCode();
            System.out.println("Response Code: " + responseCode);

            // HTTP 응답 본문 읽기
            HttpEntity responseEntity = response.getEntity();
            String responseBody = EntityUtils.toString(responseEntity);
            EntityUtils.consume(responseEntity);

            // HTTP 응답 출력
            System.out.println("Response: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}