728x90

PHP 서버에 있는 자료를 가져와서 안드로이드에서 처리하는 AsyncTask 함수다.

요청 : Text POST, 결과 : JSON, Text

테스트 환경 : Android Studio, Eclipse


 === PHPComm.java ===

 package com.tistory.link2me.common;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.util.Log;
import android.webkit.CookieManager;

public class PHPComm extends Activity {

    // serverURL : JSON 요청을 받는 서버의 URL
    // postParams : POST 방식으로 전달될 입력 데이터
    // 반환 데이터 : 서버에서 전달된 JSON 데이터
    public static String getJson(String serverUrl, String postParams) throws Exception {

        BufferedReader bufferedReader = null;  
        try {  
            Thread.sleep(100);
            URL url = new URL(serverUrl);  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 세션 쿠키 전달
            String cookieString = CookieManager.getInstance().getCookie(Value.IPADDRESS);
            
            StringBuilder sb = new StringBuilder();  
            sb.setLength(0);

            if(conn != null){ // 연결되었으면
                //add request header
                conn.setRequestMethod("POST");
                conn.setRequestProperty("USER-AGENT", "Mozilla/5.0");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
                if (cookieString != null) {
                   conn.setRequestProperty("Cookie", cookieString);
                   Log.e("PHP_getCookie", cookieString);
                 }
                conn.setConnectTimeout(10000);
                conn.setReadTimeout(10000);
                conn.setUseCaches(false);
                conn.setDefaultUseCaches(false);
                conn.setDoOutput(true); // POST 로 데이터를 넘겨주겠다는 옵션
                conn.setDoInput(true);

                // Send post request
                DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
                wr.writeBytes(postParams);
                wr.flush();
                wr.close();

                int responseCode = conn.getResponseCode();
                System.out.println("GET Response Code : " + responseCode);        
                if(responseCode == HttpURLConnection.HTTP_OK){ // 연결 코드가 리턴되면
                    bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    String json;
                    while((json = bufferedReader.readLine())!= null){
                        sb.append(json + "\n");
                    }      
                }
                bufferedReader.close();
            }
            System.out.println("PHP Comm Out Size : " + sb.length()); // 서버에서 보내준 결과의 길이
            System.out.println("PHP Comm Out : " + sb); // 서버에서 보내준 내용
            return sb.toString().trim();
            
        } catch(Exception e){  
            return new String("Exception: " + e.getMessage());
        }
 
    }
}


위 함수의 사용법 예제

 public class MainActivity extends Activity {
    String idx;
    String regdate;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        idx = pref.getString("idx", "");
        regdate = pref.getString("regdate", "");
        SQLiteDBChk(idx, regdate); // 서버 데이터를 가져와서 SQLiteDB에 저장하는 로직

    }

    private void SQLiteDBChk(String idx, String regdate) {
        Uri.Builder builder = new Uri.Builder()
            .appendQueryParameter("idx", idx)
            .appendQueryParameter("regdate", regdate);
        String postParams = builder.build().getEncodedQuery();

        getChartData getData = new getChartData();
        getData.execute(Value.IPADDRESS + "/SQLiteDB.php", postParams);

    }

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

        @Override
        protected String doInBackground(String... params) {
            try {
                return PHPComm.getJson(params[0], params[1]);
                // 수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate 의 파라미터가 된다
            } catch (Exception e) {
                return new String("Exception: " + e.getMessage());
            }
        }

        protected void onPostExecute(String result) {
            // 서버에서 전송받은 결과를 파싱하여 처리

        }
    }

}


위 코드 파일

PHPComm.zip

위 코드는 Eclipse 에서는 쿠키값이 잘 전달되는데 Android Studio 에서는 쿠키정보가 성공적이지 못했다.

쿠키를 이용해서 정보를 주고받지 않고 다른 키(idx)를 이용하여 정보를 주고 받는다.

쿠키 부분 코드는 삭제해도 되고 그냥 두어도 된다.


728x90
블로그 이미지

Link2Me

,