«Tistory 블로그에서 작성했던 글»
협업 프로젝트를 진행하다 보면 REST API를 사용해야 하는 경우가 있다.
이번에 REST API를 호출하는 기능을 만드는 기회가 있어서 정리를 위해 글을 남긴다.
내가 사용한 방식은 HttpURLConnection을 이용한 방식이다.
리턴 방식은 JSON 형태로 아래와 같다고 하자.
JSON Data
1
2
3
4
5
6
7
{
success : true/false,
data : {
data1 : "data1",
data2 : "data2"
}
}
위의 결과를 받기 위한 REST API 호출 코드는 아래와 같다.
JAVA Method
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public Map<String, Object> callRestApi(String paramVal1) {
// JSON 파라미터
String jsonParam1 = "abcd";
String jsonParam2 = "1234";
// URL 세팅
String urlString = "http://chaedae.tistory.com";
urlString += "?param1="+paramVal1; urlString += "& param2={\\"json1\\":"+jsonParam1+",\\"json2\\":"+jsonParam2+"}";
URL url = new URL(urlString);
// 커넥션 오픈
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// ReqeustMethod 설정 (POST / GET)
conn.setRequestMethod("GET");
//conn.setReqeustMethod("POST");
// content-Type 설정 (리턴 값이 JSON형태로 온다면 이 옵션도 설정해야 함)
conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// HttpConnection 스트림 읽기 (리턴 값 가져오기)
InputStream inputStream = null;
try {
inputStream = conn.getInputStream();
} catch (IOException e) {
e.printStackTrace();
throw new ApplicationException("", "Error", "HttpConnection 읽기 스트림 획득에 실패했습니다.", "");
}
// UTF-8로 인코딩 해서 가져오기
BufferedReader r = null;
try {
r = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String line;
StringBuilder msg = new StringBuilder();
// BufferedReader를 이용해서 가져온 InpustStream을 StringBuilder에 담는다.
try {
while ((line = r.readLine()) != null) {
msg.append(line);
}
r.close();
} catch (IOException e) {
throw new ApplicationException("", "Error", "HttpConnection 스트림 읽기에 실패했습니다.", "");
}
// ObjectMapper 와 JsonParser를 사용하여 JSON 형태로 변환
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// Json 데이터를 Map형태로 변환
Map<String,Object> map = new HashMap<String, Object>();
map = objectMapper.readValue(msg.toString(), new TypeReference<HashMap<String, Object>>(){});
Boolean success = (Boolean) map.get("success");
Map<String, Object> returnMap = new HashMap<String, Object>();
if (success.equals(true)) {
System.out.println("성공");
returnMap.put((Map<String, Object>) map.get("data"));
} else {
System.out.println("실패");
}
return returnMap;
}
주석을 참고하면 특별한 내용은 없고 주의할 사항이 하나 있다.
Content-Type 을 정의할 때 위 예제에는 application/json
을 사용 했지만
때때로 application/x-www-form-urlencoded
를 사용해야 하는 경우도 있다.
자세한 내용은 아래 링크에서 확인하시길..
(Http Method는 POST, Content-Type이 application/x-www-form-urlencoded인 경우 body를 encoding하는게 맞을까?)