반응형
네트워크를 통해서 HTTP 통신 후 Request 로 응답처리까지 처음하는 사람의 경우 어려울 수도 있어서 정리함
코드는 간단하게 정리해서 공유드리겠음
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif)
클래스는 2개를 추가해야한다.
RequestHttpConnection.java 와 NetworkTask.java 클래스 2개를 생성한다.
SMALL
1. RequestHttpConnection.java
HTTP 연결 및 데이터 전달을 위한 클래스, 방식은 POST
public class RequestHttpConnection {
public String request(String _url, ContentValues _params){
// HttpURLConnection 참조 변수.
HttpURLConnection urlConn = null;
// URL 뒤에 붙여서 보낼 파라미터.
StringBuilder sbParams = new StringBuilder();
/**
* 1. StringBuffer에 파라미터 연결
* */
// 보낼 데이터가 없으면 파라미터를 비운다.
if (_params == null)
sbParams.append("");
// 보낼 데이터가 있으면 파라미터를 채운다.
else {
// 파라미터가 2개 이상이면 파라미터 연결에 &가 필요하므로 스위칭할 변수 생성.
boolean isAnd = false;
// 파라미터 키와 값.
String key;
String value;
for(Map.Entry<String, Object> parameter : _params.valueSet()){
key = parameter.getKey();
value = parameter.getValue().toString();
// 파라미터가 두개 이상일때, 파라미터 사이에 &를 붙인다.
if (isAnd)
sbParams.append("&");
sbParams.append(key).append("=").append(value);
// 파라미터가 2개 이상이면 isAnd를 true로 바꾸고 다음 루프부터 &를 붙인다.
if (!isAnd)
if (_params.size() >= 2)
isAnd = true;
}
}
/**
* 2. HttpURLConnection을 통해 web의 데이터를 가져온다.
* */
try{
URL url = new URL(_url);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setConnectTimeout(HTTP_TIMEOUT_m);
urlConn.setReadTimeout(HTTP_TIMEOUT_m);
// [2-1]. urlConn 설정.
urlConn.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST.
urlConn.setRequestProperty("Accept-Charset", "UTF-8"); // Accept-Charset 설정.
urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;cahrset=UTF-8");
// [2-2]. parameter 전달 및 데이터 읽어오기.
String strParams = sbParams.toString(); //sbParams에 정리한 파라미터들을 스트링으로 저장. 예)id=id1&pw=123;
OutputStream os = urlConn.getOutputStream();
os.write(strParams.getBytes(StandardCharsets.UTF_8)); // 출력 스트림에 출력.
os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행.
os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제.
// [2-3]. 연결 요청 확인.
// 실패 시 null을 리턴하고 메서드를 종료.
if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
Log.e("RequestHttpConnection : Err[2-3] " + urlConn.getResponseCode());
return null;
}
// [2-4]. 읽어온 결과물 리턴.
// 요청한 URL의 출력물을 BufferedReader로 받는다.
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), StandardCharsets.UTF_8));
// 출력물의 라인과 그 합에 대한 변수.
String line;
StringBuilder page = new StringBuilder();
// 라인을 받아와 합친다.
while ((line = reader.readLine()) != null){
page.append(line);
}
return page.toString();
} catch (IOException e) { // for URL.
e.printStackTrace();
}// for openConnection().
finally {
if (urlConn != null)
urlConn.disconnect();
}
Log.e("RequestHttpConnection : Err[END]");
return null;
}
}
2. NetworkTask.java
AsyncTask 로 네트워크 Request 를 호출하여 처리할 수 있도록 함
public class NetworkTask extends AsyncTask<Void, Void, String> {
private final String url;
private final ContentValues values;
private final Handler receiveHandler; // 리턴 메세지를 반환할 Handler
public NetworkTask(String url, ContentValues values, Handler receiveHandler) {
this.url = url;
this.values = values;
this.receiveHandler = receiveHandler;
}
@Override
protected String doInBackground(Void... params) {
Log.d("URL : " + url );
String result; // 요청 결과를 저장할 변수.
RequestHttpConnection requestHttpURLConnection = new RequestHttpConnection();
result = requestHttpURLConnection.request(url, values); // 해당 URL로 부터 결과물을 얻어온다.
return result;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//doInBackground()로 부터 리턴된 값이 onPostExecute()의 매개변수로 넘어오므로 s를 메세지에 담아 리턴한다.
try {
Log.d("onPostExecute : " + s );
Message msg = receiveHandler.obtainMessage(SEND_WEB_RETURN);
Bundle data = new Bundle();
data.putString("WEB_RETURN", s);
msg.setData(data);
receiveHandler.sendMessage(msg);
}catch (Exception e){
e.printStackTrace();
}
}
}
위 클래스를 작성하였다면 이젠 사용하는 방법만 익히면 가능함
3. 호출하여 사용
메인에서 호출을 진행한다고 하는 경우
아래처럼
1) POST 데이터를 ContentValues 클래스로 삽입
2) 리턴 값을 처리 할 Handler 를 생성
3) 변수들을 삽입 후 실행~!!
4) 리턴으로 돌아온 값을 처리하면 끝~!!
//POST 데이터를 삽입
ContentValues value = new ContentValues();
value.put("DATA1", data1);
value.put("DATA2", data2);
// 데이터 리턴값을 처리할 Handler
Handler receive_handler = new Handler(msg -> {
if(msg.what == SEND_WEB_RETURN){
String data = msg.getData().getString("WEB_RETURN");
if(!data.equals("null")){
try {
Log.d("RecvData", data);
JSONObject object = new JSONObject(data); //JSON 파싱
... //그 이후 응답 데이터 처리 진행
} catch (JSONException e) {
e.printStackTrace();
}
}
}
return true;
});
NetworkTask HTTP_REQ = new NetworkTask("URL 주소", value, receive_handler);
HTTP_REQ.execute();
복잡해 보이지만 RequestHttpConnection.java 와 NetworkTask.java 는 한번 만들어 두면 변경할 필요없이 계속 사용 가능하다.
그럼 오늘도 모두들 화이팅 하세요 ㅎㅎ
반응형
'개발 정보 공유 > Android' 카테고리의 다른 글
안드로이드 BadTokenException 처리 (0) | 2021.12.06 |
---|---|
안드로이드 파일 복사/이동 하기 (28) | 2021.12.03 |
안드로이드 API 29 이상 listFiles 호출 시 Null 발생 및 MediaStore 이용해서 파일 이동(내부, 외부 파일 경로) (7) | 2021.12.01 |
Android / btsnoop_hci.log 획득하기 (6) | 2021.11.19 |
안드로이드 메세지(Message) 처리방식 (0) | 2021.09.13 |