반응형
📝body 데이터 받기 (Servlet)
@RequestMapping(value = "/post.do", method = RequestMethod.POST)
public void post(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 한번만 호출 가능 (분석 안 해서 왜 그런지는 모름)
String body = getBody(request);
System.out.println(body);
JSONObject obj = new JSONObject(body);
System.out.println(obj.get("searchWord"));
System.out.println(obj.get("pageNum"));
response.setContentType("application/json; charset=UTF-8");
PrintWriter writer = null;
writer = response.getWriter();
writer.print(obj);
writer.flush();
}
public static String getBody(HttpServletRequest request) throws IOException {
String body = null;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
return body;
}
출처 : https://kwonyang.tistory.com/2
📝body 데이터 받기 (requestBody) [HashMap]
package com.lsj.spring_study;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
final static Logger logger = LogManager.getLogger(HomeController.class);
final static Logger APIParamLogger = LogManager.getLogger("AS_API_PARAM");
@RequestMapping(value = "/getLogs.do", method = RequestMethod.GET)
public void logs() {
APIParamLogger.error("TRACE TEST");
logger.info("INFO TEST");
logger.debug("DEBUG TEST");
logger.warn("WARN TEST");
logger.error("ERROR TEST");
logger.fatal("FATAL TEST");
System.out.println(logger.getLevel());
System.out.println(logger.getLevel().intLevel());
// Logger APIParamLogger = LogManager.getLogger("AS_API_PARAM");
// APIParamLogger.info("abc");
}
/** params **/
@RequestMapping(value = "/params.do", method = RequestMethod.POST)
public void params(String code,String name) {
// 호출 Url : localhost:8080/jsonToObject.do?name=hello&age=20e
// Content-Type : params
// Header : key → name, Value → hello
// Header : key → age, Value → 20
System.out.println(">>> " + code); // null
System.out.println(">>> " + name); // Lee
/** 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능하다. **/
}
/** params **/
@RequestMapping(value = "/paramsToObject.do", method = RequestMethod.POST)
public void paramsToObject(BodyVO bodyVO) {
// 호출 Url : localhost:8080/jsonToObject.do?name=hello&age=20e
// Content-Type : params
// Header : key → name, Value → hello
// Header : key → age, Value → 20
System.out.println(">>> " + bodyVO.getName()); // hello
System.out.println(">>> " + bodyVO.getAge()); // 20
/** 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능하다. **/
}
/** application/x-www-form-urlencoded **/
@RequestMapping(value = "/urlencoded.do", method = RequestMethod.POST)
public void urlencoded(String code,String name) {
// 호출 Url : urlencoded.do?name=Lee
// Content-Type : application/x-www-form-urlencoded
// Body : key → code, Value → ABC
// key → name, Value → Lee
System.out.println(">>> " + code); // ABC
System.out.println(">>> " + name); // Lee
// 일반적으로 POST 방식에 쿼리스트링을 붙히지 않지만 붙혀도 인식이 가능함
// x-www-form-urlencoded 의 경우 쿼리스트링처럼 code=ABC 인식을 한다.
}
/** application/x-www-form-urlencoded **/
@RequestMapping(value = "/urlencodedToObject.do", method = RequestMethod.POST)
public void urlencodedToObject(BodyVO bodyVO) {
// 호출 Url : urlencoded.do
// Content-Type : application/x-www-form-urlencoded
// key → name, Value → Lee
// Body : key → age, Value → 20
System.out.println(">>> " + bodyVO.getName()); // Lee
System.out.println(">>> " + bodyVO.getAge()); // 20
}
/** application/x-www-form-urlencoded의 경우 따로 RequestBody가 필요없다. 동작방식이 GET의 Header와 동일한 것 같다 **/
/** 이 밑에의 MIME 타입은 반드시 RquestBody를 사용해서 값을 받을 수 있다. **/
/** text **/
@RequestMapping(value = "/text.do", method = RequestMethod.POST)
public void text(@RequestBody String bodyContents) {
// 호출 Url : text.do
// body : this is text
// Content-Type : text 또는 text/html
System.out.println(">>> " + bodyContents); // this is text
}
/** application/json **/
@RequestMapping(value = "/json.do", method = RequestMethod.POST)
public void json(@RequestBody String bodyContents) {
// 호출 Url : json.do
// body : {"content" : "this is json"}
// Content-Type : application/json
System.out.println(">>> " + bodyContents); // {"content" : "this is json"}
}
/** application/json (Object Injection) **/
@RequestMapping(value = "/jsonToHashMap.do", method = RequestMethod.POST)
public @ResponseBody HashMap<String, Object> jsonToObject(@RequestBody HashMap<String, Object> bodyVO) {
/** BodyVO (HashMap도 또한 Object이기 떄문에 동일하게 적용 된다. **/
// String name
// String age → int 형으로 값을 보내면 못 자동 Injection이 안 된다. "age" : 20 (X)
/** 참고로 BodyVO에 default값이 설정되어 있어도 ReuqestBody에 넘어온 값이 없다면(body에 json을 안 보내면) null로 덮어씌워진다. **/
/** 필요사항에서는 데이터를 까서 검증하는 작업을 직접해야할 거 같다. **/
// 호출 Url : jsonToObject.do
// body : {"name" : "lee", "age":"20"}
// Content-Type : application/json
System.out.println(bodyVO); // {name=lee, age=20}
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("bodyVO", bodyVO);
return map;
}
/** application/json (Object Injection) **/
@RequestMapping(value = "/jsonToObject.do", method = RequestMethod.POST)
public @ResponseBody HashMap<String, Object> jsonToObject(@RequestBody BodyVO bodyVO) {
/** BodyVO (HashMap도 또한 Object이기 떄문에 동일하게 적용 된다. **/
// String name
// String age → int 형으로 값을 보내면 못 자동 Injection이 안 된다. "age" : 20 (X)
/** 참고로 BodyVO에 default값이 설정되어 있어도 ReuqestBody에 넘어온 값이 없다면(body에 json을 안 보내면) null로 덮어씌워진다. **/
/** 필요사항에서는 데이터를 까서 검증하는 작업을 직접해야할 거 같다. **/
// 호출 Url : jsonToObject.do
// body : {"name" : "lee", "age":"20"}
// Content-Type : application/json
System.out.println(">>> " + bodyVO.getName()); // lee
System.out.println(">>> " + bodyVO.getAge()); // 20
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("bodyVO", bodyVO);
return map;
}
/**
* jsonToObject.do을 사용하기 위해서는 하기 라이브러리가 필요 (body 내용을 Object에 Injeciton)
* 없어도 주입이 되는 것처럼 보이지만 4번에 한번씩 에러를 뱉는 현상 발견
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
**/
/** responseBody란 처리한 결과를 클라이언트에게 다시 돌려줘서 읽을 수 있게한다. (즉 return 값이 있어야한다.) **/
// 미사용시 → 404 페이지를 찾을 수 없음
// 사용시 → {"bodyVO" : {"name" : "lee", "age":"20"}}
}
- RequestBody를 이용해 body에 내용을 읽을 수 있다.
- 주의) 라이브러리 필요 → 전자정부의 경우 dispatcher에 추가 작업 해야함
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
📝POST방식 통신 (return JSONObject)
StringBuffer response;
// map은 body에 담아서 보낼 데이터가 존재할 때 사용 (일반적 json으로 많이 보내서 적음)
public JSONObject getConnection(String uri, HashMap<String,Object> map) {
StringBuilder sb = null;
HttpURLConnection conn = null;
JSONObject responseJson = null;
try {
URL url = new URL(uri);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
System.out.println(map);
/*
// body에 json 데이터 담아서 request 할때 사용
JSONObject obj = new JSONObject(map);
try (OutputStream os = conn.getOutputStream()){
byte request_data[] = obj.toString().getBytes("utf-8");
os.write(request_data);
os.close();
}
*/
int responseCode = conn.getResponseCode();
if (responseCode == 400 || responseCode == 401 || responseCode == 500) {
System.out.println(responseCode + " Error!");
} else {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
sb = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
responseJson = new JSONObject(sb.toString());
// System.out.println(responseJson);
return responseJson;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
System.out.println("not JSON Format response");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return responseJson;
}
📝Get방식 통신 (return JSONObject)
public JSONObject getConnection(String uri) {
StringBuilder sb = null;
HttpURLConnection conn = null;
JSONObject responseJson = null;
try {
URL url = new URL(uri);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
// conn.setDoOutput(true);
JSONObject commands = new JSONObject();
int responseCode = conn.getResponseCode();
if (responseCode == 400 || responseCode == 401 || responseCode == 500) {
System.out.println(responseCode + " Error!");
} else {
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
sb = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
responseJson = new JSONObject(sb.toString());
// System.out.println(responseJson);
return responseJson;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
System.out.println("not JSON Format response");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return responseJson;
}
📝Get방식 통신 (return String)
StringBuffer response;
public String callGetMethod(String url) {
try {
// 통신 주소 등록
URL obj = new URL(url);
// 통신 방식 설정
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8" );
conn.setDoOutput(true);
conn.setRequestMethod("GET");
// ---- 읽어온 데이터를 담기 ----
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String inputLine;
response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
// ---- 읽어온 데이터를 반환 ----
String responseData =response.toString();
return responseData;
}
conn.setRequestProperty만 주의해서 작성 나머진 그대로 활용 가능 → application/json; charset-utf-8
📝Delete 방식 통신
public void callDeleteMethod(String url) {
URL obj;
try {
obj = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection) obj.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("DELETE");
httpCon.connect();
int responseCode = httpCon.getResponseCode();
// connect만 해서 끝이 아니라 무조건 어떤 행동을 해야 위에 동작이 진행된다.
} catch (Exception e) {
e.printStackTrace();
}
}
반응형
'[Java] > [Java Code]' 카테고리의 다른 글
[Java Code] Pagination Select Box (0) | 2022.02.18 |
---|---|
[Java Code] Pagination (0) | 2022.02.18 |
[Java Code] 파일 읽어 데이터 가져오기 (0) | 2022.02.12 |
[Java Code] JsonObject, JsonArray (org.json) (0) | 2022.02.04 |
[Java Code] URLEncode, URLDecode 인코딩 변경하기 (0) | 2021.12.27 |