Java API 호출 유틸 개발 / HttpURLConnection 객체 사용법

API 호출 유틸 개발

통합 SSO 로그인 API, 타 팀 API 등 URL 연결이 많은 프로젝트라서 공통 유틸을 만들어보았습니다.

URLConnectionUtil.java

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLConnectionUtil {

	// GET 방식으로 URL 요청 후 결과 String 반환
	public String requestGetURL(String urlStr, String paramType) throws Exception {
		URL url = new URL(urlStr);
		
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Content-Type", paramType);
		conn.setDoOutput(true);
	
		return getInputStreamStr(conn.getInputStream());
	}

	// InputStream 읽어서 String 반환
	public String getInputStreamStr(InputStream inputStream) throws Exception {
		BufferedReader bufferedReader = null;
		String resultStr = "";
		
		try {
			bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

			String inputLine;
			while ((inputLine = bufferedReader.readLine()) != null) {
				resultStr = resultStr.concat(inputLine);
			}

		} finally {
			if (bufferedReader != null) {
				bufferedReader.close();
			}
		}
		
		return resultStr;
	}
}

URLConnectionUtil 호출 예시

String apiResultStr = urlConnectionUtil.requestGetURL("https://통합SSOURL:446/api/auth/Authorize?Token=" + token, "text/html");

GET 방식으로 URL 요청 후 결과 텍스트를 반환합니다.

결과 텍스트 예시

{"Status":1000,"StatusCode":"AUTH_OK","Message":"인증정보가 확인되었습니다.","Result":{"Items":{"Token":"g%2fXUucTQHE5RrufUP4QuT2BY71Bad%2fgMofCh4WGKRhZyUcY%2fX4J7Cz5vu%2fqApkFzI%2fPxf5wlrgnpKH2YKR66oA%3d~~~","UserID":"유저명"}}}

API 서버로부터 JSON 형태의 결과값을 받았습니다.

Java JSON 파싱 예시

JSONParser parser = new JSONParser();
JSONObject jsonObj = (JSONObject) parser.parse(api1ResultStr);

if (jsonObj.get("StatusCode") != null) {
	String StatusCode = (String) jsonObj.get("StatusCode");
	if ("AUTH_OK".equals(StatusCode)) {

		JSONObject result = (JSONObject) jsonObj.get("Result");
		JSONObject items = (JSONObject) result.get("Items");
		String token = (String) items.get("Token");
	}
}

결과 텍스트 JSON에서 Result 안의 Items 안의 Token 값을 꺼내는 예시입니다.


HttpURLConnection 객체

setRequestProperty 함수

요청 헤더에 키, 값을 추가하는 함수입니다.

Content-Type 파라미터

application/json JSON 형식으로 전송
text/html TEXT 형식으로 전송

요청 시 전달하는 파라미터 형식을 지정할 수 있습니다.

쿠키 파라미터

conn.setRequestProperty("Cookie", "쿠키Key1=값; 쿠키Key2=값");

요청 쿠키 값을 세팅하여 보낼 수 있습니다.


URLConnection 오류 해결

파라미터 인코딩 오류

GET 방식 URL 뒤에 붙이는 파라미터 값에 +가 들어가면 400 에러가 발생할 수 있습니다.

String tokenEnc = URLEncoder.encode(token, "UTF-8");
String apiResultStr = urlConnectionUtil.requestGetURL("https://통합SSOURL:446/api/auth/Authorize?Token=" + tokenEnc, "text/html");

위와 같이, URLEncoder를 사용하여 파라미터 값을 UTF-8로 인코딩하여 + 등의 특수문자를 치환해 보내면 됩니다.

400 에러 파라미터 모음

WZfm8EgHEQjJn5m9xBLIDYzOgX1HIPe9oX40svhb+ACpjHM55Ae2j56tQyfZp61C
WZfm8EgHEQjJn5m9xBLIDW07rylPTPK7qTls883VxnBD5VdONWykbik+6/gOmdR/
WZfm8EgHEQjJn5m9xBLIDaQJmjnTxPgXwzf1uF/fLuqSYM9uW5y3cb7+BAqocZGW
WZfm8EgHEQjJn5m9xBLIDX2iu/fLwX9ibQtZmvH2+Ew9BA4tuCH5SwRVQ+ilyAde
WZfm8EgHEQjJn5m9xBLIDUfc5xn8eW0DJcA9xMcGNloe7Kl4BeC6FSC9HuL+WSTF

성공 파라미터 모음

WZfm8EgHEQjJn5m9xBLIDSx5YYBHXlJ77FRBdupWLmXOnD6ZgeMouQfx8dseogQJ
WZfm8EgHEQjJn5m9xBLIDXSjB3aPMG4HH9i38Fr8ZkZKYwBIGCuHM6kKZnSyt/pu
WZfm8EgHEQjJn5m9xBLIDaGYKDzGdH/ZzQhPS0onwCdfFhNKGxl2/LQ6pmF5QOi/
WZfm8EgHEQjJn5m9xBLIDaj7QwOpcqfxOXG0k4RNCz9EquCGQoB0ntcUudJhFTlh
WZfm8EgHEQjJn5m9xBLIDYmyYiniFKHKgwrFpkSoW3qISOpmQ7y9bHskFHgBWM00
WZfm8EgHEQjJn5m9xBLIDbX5WnEu7QOo4Cs8WzUpmtbry0pws1oYEPl2NVQFizLz

URL 디코딩 방법

String token = URLDecoder.decode(tokenEnc, "UTF-8");

파라미터 디코딩 오류

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

+가 들어있는 파라미터를 URLEncoder.decode 하는 경우 발생하는 에러입니다.
URL 인코딩 되어있는 문자열은 +가 “%2B”로 인코딩 되는데, API 호출 과정에서 자동 디코딩 되므로 다시 디코딩 하면 안 됩니다.

Leave a comment