'2017/09/07'에 해당되는 글 1건

728x90

OKHttp 라이브러리를 이용하여 간단하게 POST 로 데이터를 전송할 경우 알아두어야 할 사항을 적어둔다.

OKHttp 라이브러리 사용조건이 최소 KIKAT 버전 이상인 거 같더라. (확실한 것은 더 테스트를 해봐야....)


RequestBody 객체 부분이 파일을 첨부하는 경우와 일반 텍스트를 전송하는 경우가 약간 다르다.

나머지 부분은 동일하다.  파일을 업로드하는 경우에는 OKHttp 라이브러리를 사용하는 것이 HttpURLConnection 으로 하는 것보다 코드도 심플하고 잘 동작한다.


httpClient 는 Handler를 사용하지 않는 곳에서도 동작이 되는데, OKHttpClient는 AsyncTask 또는 Handler 에서만 동작되더라.

로그인 버튼을 누르면 httpClient 가 동작되도록 되어 있는 코드를 그냥 단순하게 OKHttp 라이브러리를 사용해서 변환하면 동작이 안된다.


httpClient = new DefaultHttpClient();
localContext = new BasicHttpContext();
httpPost = new HttpPost(Value.IPADDRESS + "/loginChk.php");

entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

try {
    entity.addPart("loginID", new StringBody(Value.encrypt(ID)));
    entity.addPart("loginPW", new StringBody(Value.encrypt(PW)));
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}

httpPost.setEntity(entity);
try {
    response = httpClient.execute(httpPost, localContext);
} catch (ClientProtocolException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}
try {
    reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
} catch (IllegalStateException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

try {
    Response = reader.readLine();
    Log.d(TAG, "응답 ====" + Response);
} catch (IOException e1) {
    e1.printStackTrace();
}


위 코드는 Eclipse 기반의 minSdkVersion 8에서 동작되는 코드인데 Android Studio minSdkVersion 16 이상으로 변환하고 FCM을 연동하니까 동작이 안되더라. FCM(Firebase Cloud Message)는 테스트를 하다보니 minSdkVersion 10 인거 같더라.

HttpClient 는 Android SDK API 23 부터는 더이상 지원을 하지 않는다.

앱 Gradle에서 compileSdkVersion 23으로 한 경우에는 useLibrary 'org.apache.http.legacy'를 하라고 나온다.

내가 테스트한 환경은 compileSdkVersion 22로 했다. 퍼미션 지정하는 것이 귀찮기도 하고 Eclipse 툴로 컴파일 한 것이 잘 동작하는 걸 Android Studio 기반으로 다시 코드를 수정 개발해야 하는 상황이라 수정을 조금이라도 덜 하는 방법을 찾아보려고 했다.

구글링을 해보면 HttpClient 를 사용할 수 있는 방법이 나오는데 그 방법으로 하는데 에러가 나면서 문제가 생긴다.

그래서 코드를 수정 사용해야 하는데 AsyncTask 기반의 OKHttp 또는 HttpURLConnection 로 변환해야 정상 동작된다.


PHPComm.getJson(params[0], params[1]) 코드는 http://link2me.tistory.com/1247 를 참조하면 된다.

OKHttp 로그인 예제 http://link2me.tistory.com/1353 를 보면서 이 내용을 보면 이해할 수 있다.


Uri.Builder builder = new Uri.Builder()
    .appendQueryParameter("loginID", Value.encrypt(ID))
    .appendQueryParameter("loginPW", Value.encrypt(PW));
String postParams = builder.build().getEncodedQuery();
AsyncTaskLogin asyncLogin = new AsyncTaskLogin();
asyncLogin.execute(Value.IPADDRESS + "/loginChk.php", postParams);

 class AsyncTaskLogin extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // 이곳에 OKHttp 라이브러리 기반 코드를 작성
        // 또는 HttpURLConnection 코드를 작성한다.
        try {
            return PHPComm.getJson(params[0], params[1]);
        } catch (Exception e) {
            return new String("Exception: " + e.getMessage());
        }
    }

    protected void onPostExecute(String result) {

    }
}


HttpClient 를 사용하는 방법이 http://goodnut.tistory.com/60 에 나오는데 이 방법으로는 테스트를 안해봤다.


아래 코드는 단독으로는 동작이 안되고 에러가 발생한다.

반드시 Handler or AsyncTask 에서 동작하도록 코드를 작성해야 한다.


void Agree() {
    String url = Value.IPADDRESS + "/regAssent.php";

    RequestBody requestBody = new FormBody.Builder()
            .add("idx", idx)
            .add("assent", "1")
            .build();

    Request request = new Request.Builder()
            .url(url)
            .post(requestBody)
            .build();

    OkHttpClient client = new OkHttpClient();
    try {
        Response response = client.newCall(request).execute();
        Log.d(TAG, "응답 ====" + response);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
 


참고하면 도움되는 사이트


http://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html


http://www.zoftino.com/android-okhttp-example


블로그 이미지

Link2Me

,