Post

[Java] HttpURLConnection으로 외부 API 호출하기(GET, POST 요청)

Java 라이브러리 HttpURLConnection을 이용하여 외부 API를 호출하고 테스트 서버를 통해 테스트해본다.

소스코드

[0] 선수 작업

  • JSON으로 데이터를 처리할 것이기 때문에 json- simple 라이브러리를 import하는 작업이 필요하다. IntelliJ에 라이브러리 추가하기를 참고할 수 있다.

  • 우선 클래스 구조는 이렇게 작성했다. 꼭 클래스를 만들거나 함수 안에서 실행해야하는 것은 절대 아니다. 생성자나 Getter, Setter는 여기서는 생략한다. 전체 소스코드는 상단에 소스코드 버튼을 누르면 확인할 수 있다.

🔽 ApiCaller.java

1
2
3
4
5
6
7
8
9
public class ApiCaller {
    private String baseUrl;
    private int responseCode;

    public JSONObject sendGetRequest() {
    }

    public void sendPostRequest() {
    }

[1] GET 요청 보내기

🔽 ApiCaller.java > sendGetRequest()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public JSONObject sendGetRequest() {
    JSONObject data = new JSONObject();
    try {
      URL url = new URL(baseUrl);

      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestMethod("GET"); //Http Method 지정(default가 GET이라 생략가능)
      conn.connect();

      //InputStream으로 데이터를 읽고, JSONParser를 이용해 JSONObject로 파싱
      InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
      JSONParser jsonParser = new JSONParser();
      data = (JSONObject) jsonParser.parse(inputStreamReader);

      responseCode = conn.getResponseCode(); //응답코드 담기
    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }
    return data;
}

[2] POST 요청 보내기

🔽 ApiCaller.java > sendPostRequest()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void sendPostRequest(String content) {
    try {
      URL url = new URL(baseUrl); //URL 객체 생성

      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestMethod("POST"); //Http Method 지정
      conn.setRequestProperty("Content-Type", "application/json"); //JSON 형태로 데이터 전송
      conn.setDoOutput(true); //OutputStream을 통해 데이터를 전송할지 여부
      conn.connect();

      //OutputStream을 통해 데이터를 전달
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(conn.getOutputStream());
      outputStreamWriter.write(content);
      outputStreamWriter.flush();

      responseCode = conn.getResponseCode(); //응답코드 담기
    } catch(IOException e) {
        e.printStackTrace();
    }
}
  • (라인 8) setDoOutput(true)로 설정하면 request body에 해당하는 내용을 OutputStream을 통해 전달하겠다는 의미이다.

[3] 테스트하기

Webhook.site 테스트 서버를 통해 HttpURLConnection이 올바르게 동작하는지 간단히 테스트해본다.

Webhook.site는 사용자마다 고유 API 서버를 제공해준다. 회원가입 없이 500개까지 요청을 보낼 수 있어서 간단히 연결 테스트를 하기에 적합할 것 같다. 무료버전에서는 POST로 데이터를 전송했을 때 그 데이터를 서버에서 받는 기능은 사용할 수 없다.

응답 데이터 설정

오른쪽 상단에 Edit 버튼을 누르면 응답으로 내려줄 데이터를 설정할 수 있다.

  • Default status code: 200
  • Content Type: application/json
  • Timeout before response: 5
  • Response body: { “Description”: “This is api test.”, “Language”: “Java”, }

테스트 실행

Webhook.site 에서 받은 unique url을 이용하여 테스트를 실행한다.

🔽 Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
        ApiCaller apiCaller = new ApiCaller("https://webhook.site/123456a7-b116-4cd9-951e-0fg2h7di4j56");

        System.out.println("//===== GET REQUEST =====//");
        JSONObject data = apiCaller.sendGetRequest();
        System.out.println("The Data from Server: " + data);
        System.out.println("Response Code : " + apiCaller.getResponseCode());

        System.out.println("//===== POST REQUEST =====//");
        apiCaller.sendPostRequest("Mood: Nerdy");
        System.out.println("Response Code : " + apiCaller.getResponseCode());
    }
}

테스트 결과

1
2
3
4
5
//===== GET REQUEST =====//
The Data from Server: {"Description":"This is api test.","Language":"Java"}
Response Code : 200
//===== POST REQUEST =====//
Response Code : 200

참고

This post is licensed under CC BY 4.0 by the author.