프로젝트를 진행하던중 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으로 전송됨에 주의해야합니다.

 

 

 

 

 

 

 

 

 

Posted by by.타니
,