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)를 이용하여 정보를 주고 받는다.
쿠키 부분 코드는 삭제해도 되고 그냥 두어도 된다.