JAVA로 HTTP POST 요청 보내기

LeeYulhee·2023년 12월 22일
0

👉 JSON 문자열을 이용한 POST 요청 구현


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpGetRequest {
    public static void main(String[] args) throws IOException {

        URL url = new URL("https://www.example.com"); // 요청을 보낼 URL을 정의
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // URL에 대한 연결을 염

        connection.setRequestMethod("POST"); // HTTP 요청 방식을 POST로 설정
        connection.setDoOutput(true); // 요청 본문에 데이터를 전송할 수 있도록 함
        connection.setRequestProperty("Content-Type", "application/json"); // 요청의 컨텐츠 타입을 JSON으로 설정

        String jsonInputString = "{\"MSG_HEADER\":{},\"MSG_BODY\":{\"USER_ID\":\"EXAMPLE\",\"USER_SECRET\":\"SECRET_EXAMPLE\"}}";
        // 서버로 전송할 JSON 형식의 문자열을 정의

        try(OutputStream os = connection.getOutputStream()) {
            byte[] input = jsonInputString.getBytes("utf-8"); // JSON 문자열을 바이트 배열로 변환
            os.write(input, 0, input.length); // 변환된 바이트 배열을 출력 스트림을 통해 전송
        }

        int responseCode = connection.getResponseCode(); // 서버로부터 받은 HTTP 응답 코드를 가져옴
        System.out.println("Response Code : " + responseCode); // 응답 코드를 콘솔에 출력

        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 서버로부터의 응답을 읽기 위한 BufferedReader를 생성
        String inputLine;
        StringBuffer response = new StringBuffer(); // 서버 응답을 저장할 StringBuffer 객체를 생성

        while ((inputLine = in.readLine()) != null) { // 서버 응답의 끝까지 한 줄씩 읽어 들임
            response.append(inputLine); // 읽은 데이터를 StringBuffer 객체에 추가
        }
        in.close(); // BufferedReader를 닫아 리소스를 해제

        System.out.println(response.toString());  // 받은 JSON 응답을 콘솔에 출력
    }
}


👉 코드 해석 : OutputStream과 JSON 데이터 처리


try(OutputStream os = connection.getOutputStream()) {
    byte[] input = jsonInputString.getBytes("utf-8"); // JSON 문자열을 바이트 배열로 변환
    os.write(input, 0, input.length); // 변환된 바이트 배열을 출력 스트림을 통해 전송
}
  • try 블럭 안에서 OutputStream 객체를 생성하는 이유
    • 자원을 자동으로 관리하기 위해서
    • 블럭이 끝나면 OutputStream 객체가 자동으로 닫힘

  • OutputStream의 역할
    • getOutputStream을 호출하면 서버로 데이터를 보낼 수 있는 OutputStream 객체가 생성됨
    • OutputStream은 데이터 전송 매개체로서의 역할로 출력 스트림을 얻어 서버로 데이터를 전송하는데 사용

  • JSON 문자열을 바이트 배열로 변환하는 이유
    • 데이터를 바이트로 변환해야지 네트워크를 통해 서버에 전송할 수 있음
    • 서버에 어떤 텍스트나 파일을 보내고 싶다면, 이를 바이트로 변환한 후 이 스트림을 통해 전송해야 함

  • write() 메서드의 역할
    • 변환된 바이트 데이터를 OutputStream에 씀
    • write() 메서드를 사용하여 OutputStream에 데이터를 쓰면, OutputStream의 내부 버퍼에 저장되고 버퍼가 가득 차면 네트워크를 통해 데이터 전송
    • OutputStream을 닫을 때, 부적으로 flush()가 호출되어 남아 있는 모든 데이터가 전송됨



👉 JSON 객체를 이용한 POST 요청 구현


import org.json.JSONObject;

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;

public class GetAccessTokenRequest {
    public static void main(String[] args) throws IOException {
        URL url = new URL( "https://www.example.com" );
        HttpsURLConnection connection = ( HttpsURLConnection ) url.openConnection();

        connection.setRequestMethod( "POST" );
        connection.setDoOutput( true );
        connection.setRequestProperty( "Content-Type", "application/json" );

        JSONObject requestHeader = new JSONObject();
        JSONObject requestBody = new JSONObject();
        requestBody.put("USER_ID", "EXAMPLE");
        requestBody.put("USER_SECRET", "SECRET_EXAMPLE");

        JSONObject jsonRequest = new JSONObject();
        jsonRequest.put("MSG_HEADER", requestHeader);
        jsonRequest.put("MSG_BODY", requestBody);

        try( OutputStream os = connection.getOutputStream() ) {
            byte[] input = jsonRequest.toString().getBytes( "utf-8" );
            os.write( input, 0, input.length );
        }

        int responseCode = connection.getResponseCode();
        System.out.println( "Response Code : " + responseCode );

        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        JSONObject jsonResponse = new JSONObject(response.toString());
        System.out.println(jsonResponse.toString(4));
    }
}
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글