반응형
1. 설명
이 포스트에서 다룰 예제는 지난 포스트에서 정의한 인터페이스를 구현하고, 모듈을 사용해서 HTTP Request를 API에 보내고, Response 결과를 처리하는 코드가 되겠습니다.
통신시에는 JSON데이터를 Request Body에 담아서 보내고, Response Body에는 JSON데이터가 담겨져 리턴되는 것을 상정하였습니다.
2. 소스코드
- Request Body에 JSON데이터 설정을 처리하기 위한 인터페이스 구현 클래스
public class RequestBodyJson implements RequestBody {
public RequestBodyJson() {}
public RequestBodyJson(Object data) throws UnsupportedEncodingException {
this.data = ((String)data).getBytes("UTF-8");
}
private byte[] data;
@Override
public void setData(Object data) throws UnsupportedEncodingException {
this.data = ((String)data).getBytes("UTF-8");
}
@Override
public void setData(File target) throws UnsupportedEncodingException, IOException {
this.data = readFileToStr(target).getBytes("UTF-8");
}
@Override
public void setData(File target, String originEncoding, String newEncoding)
throws UnsupportedEncodingException, IOException {
this.data = translatorStr(readFileToStr(target), originEncoding, newEncoding).getBytes(newEncoding);
}
@Override
public byte[] getData() {
return data;
}
}
- Response Body의 JSON데이터를 처리하기 위한 인터페이스 구현 클래스
public class ResponseBodyJson implements ResponseBody{
private String resultJsonString = "";
@Override
public boolean readResult(BufferedReader buff) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
while ((line = buff.readLine()) != null) {
sb.append(line).append("\n");
}
this.resultJsonString = sb.toString();
return ( this.resultJsonString != null || !this.resultJsonString.equals("")) ? true : false;
}
@Override
public Object getResult() throws IOException {
return this.resultJsonString;
}
}
- 메인
public class Net_01_HttpRequest {
static HttpUtil hu = HttpUtil.getInstance();
static JsonUtil ju = JsonUtil.getInstance();
static String apiUrl = "http://localhost:8080/api/items";
public static void main(String[] args) {
try {
// (1) GET Request를 송신하여 현재의 전체데이터를 가져오기
String resultJson = getRequest();
System.out.println("(1) GET Request Result : "+ resultJson);
JsonNode jsonNode = ju.getJsonNode(resultJson);
int childSize = jsonNode.size();
int lastItemNum = jsonNode.get((childSize - 1)).get("itemId").asInt();
System.out.println("Last Item Num : "+ lastItemNum);
// (2) 가장 마지막 번호에서 번호를 증가하여 POST Request를 송신해서 데이터 생성
int nextNum = lastItemNum + 1;
String postJsonString = "{\"itemName\":\"ItemName"+nextNum+"\","
+ "\"itemDescription\":\"itemDescription"+nextNum+"\","
+ "\"makerCode\":\""+nextNum+"\","
+ "\"price\":1000"+nextNum+","
+ "\"saleStatus\":0,"
+ "\"images\":null}";
int newItemNo = postRequest(postJsonString);
System.out.println("New Item Num : "+ newItemNo);
// (3) (2)에서 생성한 데이터의 내용을 PUT Request로 데이터 갱신
String putJsonString = "{"
+ "\"itemId\":"+newItemNo+","
+ "\"itemName\":\"ItemName"+nextNum+"\","
+ "\"itemDescription\":\"Update-itemDescription"+nextNum+"\","
+ "\"makerCode\":\""+nextNum+"\","
+ "\"price\":1000"+(nextNum * 10)+","
+ "\"saleStatus\":0,"
+ "\"images\":null}";
putRequest(newItemNo, putJsonString);
// GET Request를 송신하여 데이터가 갱신되었는지 확인
resultJson = getRequest(newItemNo);
System.out.println("Update Check : "+ resultJson);
// (4) (3)에서 갱신한 데이터의 내용을 DELETE Request로 데이터 삭제
deleteRequest(newItemNo);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getRequest() throws IOException {
return getRequest(null);
}
public static String getRequest(Integer itemNo) throws IOException {
// HttpURLConnection의 사양상 Request Body에 데이터가 있다면, Method를 GET로 설정한다고 할지라도 POST Request를 보내버리므로 NULL값을 설정해준다.
if (hu.getRequestBody() != null) hu.setRequestBody(null);
if (hu.getFormData() != null) hu.setFormData(null);
String protocol = "http";
String targetUrl = (itemNo == null)
? apiUrl
: apiUrl+"/"+itemNo;
System.out.println("URL : "+targetUrl);
Map<String, String> settings = new HashMap<String, String>();
settings.put("Method", "GET");
settings.put("HOST", "localhost:8080");
settings.put("User-Agent", "Java-Client");
settings.put("Accept", "*/*");
hu.setResponseBody(new ResponseBodyJson());
hu.request(protocol, targetUrl, settings);
return (String) hu.getResponseBody().getResult();
}
public static int postRequest(String postJson) throws UnsupportedEncodingException, IOException {
System.out.println("POST Request Body JSON = "+postJson);
hu.setRequestBody(new RequestBodyJson(postJson));
String protocol = "http";
String targetUrl = apiUrl;
System.out.println("URL : "+targetUrl);
Map<String, String> settings = new HashMap<String, String>();
settings.put("Method", "POST");
settings.put("HOST", "localhost:8080");
settings.put("User-Agent", "Java-Client");
settings.put("Accept", "*/*");
settings.put("Content-Type", "application/json; utf-8");
hu.setResponseBody(new ResponseBodyJson());
hu.request(protocol, targetUrl, settings);
System.out.println("Post Request - Response Result ");
System.out.println(hu.getResponseBody().getResult());
String result = (String)hu.getResponseBody().getResult();
String newItemId = result.replaceAll("[^\\d]", "");
return Integer.parseInt(newItemId);
}
public static void putRequest(int itemId, String putJson) throws UnsupportedEncodingException, IOException {
System.out.println("PUT Request Body JSON = "+putJson);
hu.setRequestBody(new RequestBodyJson(putJson));
String protocol = "http";
String targetUrl = apiUrl+"/"+itemId;
System.out.println("URL : "+targetUrl);
Map<String, String> settings = new HashMap<String, String>();
settings.put("Method", "PUT");
settings.put("HOST", "localhost:8080");
settings.put("User-Agent", "Java-Client");
settings.put("Accept", "*/*");
settings.put("Content-Type", "application/json; utf-8");
hu.setResponseBody(new ResponseBodyJson());
hu.request(protocol, targetUrl, settings);
System.out.println("PUT Request - Response Result ");
System.out.println(hu.getResponseBody().getResult());
}
public static void deleteRequest(int itemId) throws IOException {
String protocol = "http";
String targetUrl = apiUrl+"/"+itemId;
System.out.println("URL : "+targetUrl);
Map<String, String> settings = new HashMap<String, String>();
settings.put("Method", "DELETE");
settings.put("HOST", "localhost:8080");
settings.put("User-Agent", "Java-Client");
settings.put("Accept", "*/*");
hu.setResponseBody(new ResponseBodyJson());
hu.request(protocol, targetUrl, settings);
System.out.println("DELETE Request - Response Result ");
System.out.println(hu.getResponseBody().getResult());
}
}
지난 포스트에서 구현한 HttpUtil모듈을 호출하여 HTTP Request를 보내 DB에 CRUD처리를 실행할 수 있는 예제코드 입니다.
테스트에 사용한 API는 Spring boot로 구현으며, 이전 포스트를 참고하셔서 테스트 환경을 구축할 수 있을겁니다.
※ 이전 포스트 URL
https://koiking.tistory.com/18?category=1027535
※ API 코드
https://github.com/leeyoungseung/item-admin
3. 실행결과【Windows(이클립스) / Linux】
4. 전체코드
반응형
'프로그래밍 > Java-자주쓰는예제' 카테고리의 다른 글
【Java-데이터 통신】Postman 처럼 HTTP 통신하기 - 3.파일 업로드(Multipart/form-data) (0) | 2021.10.01 |
---|---|
【Java-데이터 통신】Postman 처럼 HTTP 통신하기 - 3.XML데이터 CRUD (0) | 2021.09.26 |
【Java-데이터 통신】Postman 처럼 HTTP 통신하기 - 1.개요 (0) | 2021.09.20 |
【Java-데이터】 XML데이터를 Java객체로 변환하기 (0) | 2021.09.19 |
【Java-데이터】 객체를 XML데이터로 변환하기 (0) | 2021.09.19 |
댓글