본문 바로가기

APP/AndroidStudio

[Android Studio] AsyncTask를 이용한 php+mysql HTTP POST 통신

반응형

1. 인터넷 권한얻기

 

네트워크 통신을 하기위해서는 당연히 인터넷 권한을 얻어야 한다.

AndroidManifast.xml로 들어가 해당 코드를 입력한다.

매니패스트 위치

 

<uses-permission android:name="android.permission.INTERNET" />

 

2. HTTP Connection Class 생성

 

JAVA 클래스 생성 방법

 

public class RequestHttpURLConnection {

    public static String postRequest(String _url, ContentValues _params) {

		HttpURLConnection urlConn = null;

        StringBuffer sbParams = new StringBuffer();

        if (_params == null)
            sbParams.append("");
        else {
            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);

                if (!isAnd)
                    if (_params.size() >= 2)
                        isAnd = true;
            }
        }

        try{
            URL url = new URL(_url);
            urlConn = (HttpURLConnection) url.openConnection();

            urlConn.setRequestMethod("POST");
            urlConn.setRequestProperty("Accept-Charset", "UTF-8"); 
            urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;cahrset=UTF-8");

            String strParams = sbParams.toString();
            OutputStream os = urlConn.getOutputStream();
            os.write(strParams.getBytes("UTF-8")); 
            os.flush(); 
            os.close(); 

            if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK)
                return null;

            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "UTF-8"));

            String line;
            String page = "";

            while ((line = reader.readLine()) != null){
                page += line;
            }

            return page;

        } catch (MalformedURLException e) { 
            e.printStackTrace();
        } catch (IOException e) { 
            e.printStackTrace();
        } finally {
            if (urlConn != null)
                urlConn.disconnect();
        }

        return null;
    }
    }

 

3. XML 버튼 생성

이벤트 발생을 위해 xml 버튼을 생성하는 코드를 작성한다.

  <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="확인"
        android:textSize="20sp"
        android:textColor="#fff"
        android:id="@+id/btn_1"/>

 

4. JAVA 코드 작성

실제 이벤트가 일어났을 때 POST 통신을 할 파라미터를 설정하고 AsyncTask를 이용해 HTTP 통신을 하는 코드이다.

AsyncTask는 비동기식으로 HTTP통신을 하기위한 방법이다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn_1;
    private final String url = "서버주소";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //초기화
        
        btn_1 = findViewById(R.id.btn_1);
        
        btn_1.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_1: //버튼

                ContentValues values = new ContentValues();
                values.put("파라미터 명", "데이터 값");
                values.put("파라미터 명", "데이터 값");

                HttpUtil networkTask = new HttpUtil(url, values);
                networkTask.execute();

                break;
        }
    }

    public class HttpUtil extends AsyncTask<Void, Void, String> {

        String url;
        ContentValues values;

        HttpUtil(String url, ContentValues values){
            this.url = url;
            this.values = values;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //progress bar를 보여주는 등등의 행위
        }

        @Override
        protected String doInBackground(Void... params) {
            RequestHttpURLConnection requestHttpURLConnection = new RequestHttpURLConnection();
            String result = requestHttpURLConnection.postRequest(url, values);
            return result; // 아래 onPostExecute()의 파라미터로 전달됩니다.
        }

        @Override
        protected void onPostExecute(String result) {
            // 결과에 따른 UI 수정

        }
    }


}

 

5. PHP 작성 (Mysql SELECT 문 예제)

		$con = mysqli_connect("DB주소","DB계정","DB비번","DB명");
		$NAME = $_POST['파라미터명'];
		$AGE = $_POST['파라미터명'];
		$sql = "SELECT * FROM 테이블명 WHERE 컬럼명 = '{$NAME}' AND 컬럼명 = '{$AGE}'";
		$statement = mysqli_query($con,$sql);
		$res = array();
		while($row = mysqli_fetch_array($statement))
		{
		$res["내보낼 파라미터명"] = $row["컬럼명"];
		}
		echo json_encode($res,JSON_UNESCAPED_UNICODE);

예제로 이름과 나이를 조건으로 학생의 점수를 가져오는 SELECT문을 작성했다.

php 코드는 개발자의 필요에따라 수정할 수 있다.

 

안드로이드 보안정책으로 인해 HTTPS통신을 권장하고 있기때문에 위와같이 HTTP통신을 진행하여도 제대로 실행이 되지 않는 경우가있다.

공부용으로 서버통신을 한다면 HTTP 사용을 허용해야한다.

AndroidManifest.xml에 아래 코드를 입력해주면 된다.

android:usesCleartextTraffic="true"

  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar"
        android:usesCleartextTraffic="true">

 

구글링 교과서에서는 보안상 안전한 HTTPS통신을 하는것을 추천한다.

 

반응형