프로젝트를 진행하던중 AWX라는 시스템에 요청을 하여 응답해주는 JSON 응답값을 받아야 하는 기능이 필요했다.
그래서 서버단에서 URL을 요청하는 로직을 구현해야 했다.
결과적으로 URL마지막에 "/"를 붙이지 않아 오랜 삽질을 하는 바람에 JAVA 단에서 REST API 를 호출 하는 방법을 전부 알게 되었다.
"/" 하나 때문에 1주일을 고생을 했다.
AWX 서버가 원망스러웠다.
URL 마지막에 "/" 하나가 없다고 401(인증에러) 응답이 왔던 것이다
만약 그런 URL이 없다고 응답이 왔으면 바로 수정했었을텐데...
아무튼 총 3가지 방법이 있다.
1.HttpURLConnection
2.HttpClient
3.스프링 RestTemplate
[sample Code]
1.HttpURLConnection 방식
URL url = new URL("요청하고 싶은 url");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//인증방식에는 두가지가 있다.
//1. 토큰 방식
//2. ID / PW 를 Base64 로 인코딩하는 방식
//1.id / pw 방식
//아이디와 비밀번호를 아래와 같은 방식으로 String 에 넣는다.
//String auth = "awxapi:ds2pass1!";
//byte[] authEncBytes = Base64.encodeBase64(auth.getBytes());
//String authStringEnc = new String(authEncBytes);
//Basic 한칸 뛰고 인코딩된 id /pw
//conn.setRequestProperty("Authorization","Basic "+authStringEnc);
//2. 토큰 방식
String AwxHeaderToken = "Bearer "+"토큰값"
conn.setRequestProperty("POST");
conn.setRequestProperty("Authorization",AwxHeaderToken);
conn.setRequestProperty("Content-Type","application/json");
conn.setRequestProperty("Accept","application/json");
conn.setConnectTimeout(5000);
conn.setDoOutput(true);
//요청시 body 사용할경우
OutputStream os = conn.getOutputStream();
os.write(epReqBody.getBytes());'
os.flush();
conn.connect();
System.out.println(conn.getResponseMessage());
int responseCode = conn.getResponseCode();
2.HttpClient 방식
[GET]
public void get(String requestURL) {
try {
HttpClient client = HttpClientBuilder.create().build(); // HttpClient 생성
HttpGet getRequest = new HttpGet(requestURL); //GET 메소드 URL 생성
getRequest.addHeader("x-api-key", RestTestCommon.API_KEY); //KEY 입력
HttpResponse response = client.execute(getRequest);
//Response 출력
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
System.out.println(body);
} else {
System.out.println("response is error : " + response.getStatusLine().getStatusCode());
}
} catch (Exception e){
System.err.println(e.toString());
}
}
[POST]
public void post(String requestURL, String jsonMessage) {
try {
HttpClient client = HttpClientBuilder.create().build(); // HttpClient 생성
HttpPost postRequest = new HttpPost(requestURL); //POST 메소드 URL 새성
postRequest.setHeader("Accept", "application/json");
postRequest.setHeader("Connection", "keep-alive");
postRequest.setHeader("Content-Type", "application/json");
postRequest.addHeader("x-api-key", RestTestCommon.API_KEY); //KEY 입력
//postRequest.addHeader("Authorization", token); // token 이용시
postRequest.setEntity(new StringEntity(jsonMessage)); //json 메시지 입력
HttpResponse response = client.execute(postRequest);
//Response 출력
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
System.out.println(body);
} else {
System.out.println("response is error : " + response.getStatusLine().getStatusCode());
}
} catch (Exception e){
System.err.println(e.toString());
}
}
3.스프링 RestTemplate
RestTemplate restTemplate = new RestTemplate();
String loginUrl = "http://localhost:8080/organizeme/j_spring_security_check";
String username = "izeye";
String password = "1234";
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();
parameters.add("j_username", username);
parameters.add("j_password", password);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(loginUrl, parameters,
String.class);
System.out.println(responseEntity);
Map의 경우에는 파라미터가 아니라 JSON으로 전송됨에 주의해야합니다.