상세 컨텐츠

본문 제목

안드로이드와 PHP연동하기(HttpURLConnection오브젝트사용)

안드로이드+드론 제작

by 김일국 2015. 1. 23. 20:13

본문

일명 REST 웹서비스(Representational State Transfer: 접속플랫폼 자체에서는 데이터생성을 하지 않고, 원격서버의 출력 데이터를 전송받아서 화면에 프리젠테이션 뿌려줌)를 구현하는데,

1.소켓통신 : Socket client=new Socket("hostname",portNumber);

2.HttpURLConnection : URL url=new URL(http://...);

3.HttpClient: HttpClient=new DefaultHttpClient();


위 구현중에 두번째인 HttpURLConnection 으로 PHP서버결과 값을 Json형식으로 출력하는 소스를 구현해 보았습니다.

원본 소스는 http://androidexample.com/Restful_Webservice_Call_And_Get_And_Parse_JSON_Data-_Android_Example/index.php?view=article_discription&aid=101&aaid=123

위 주소에 있고, 내용은 한국에 맞게 수정해 보았습니다.

패키지 생성명은 restfulwebservice 이고, 신규로 생성하시면,

파일명:RestFulWebservice.java 자바파일과 rest_ful_webservice.xml 레이아웃디자인파일이 생성됩니다.

AndroidManifest.xml : 매니페스트파일에 퍼미션라인을 추가해 주는 것을 잊지 않습니다.

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

반드시 필요한 파일 3개를 첨부파일로 추가해 보겠습니다.


RestFulWebservice.java


rest_ful_webservice.xml


HangulKeyboard.apk

(위 설치 파일은 안드로이드 가상기기AVD에서 한글키보드를 사용해서 PHP서버와 한글 입출력을 테스트해볼때 필요합니다.)

한글키패키지파일 설치화면


앱 실행 결과 화면

=================RestFulWebservice.java파일 전문================================

package com.androidexample.restfulwebservice;


import android.app.Activity;

import android.app.ProgressDialog;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.UnsupportedEncodingException;

import java.net.URL;

import java.net.URLConnection;

import java.net.URLEncoder;

import java.util.HashMap;


public class RestFulWebservice extends Activity {



    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);

        setContentView(R.layout.rest_ful_webservice);//UI 파일을 메모리에 올려 놓습니다.


        final Button GetServerData = (Button) findViewById(R.id.GetServerData);//UI화면의 GetServerData버튼 Element를 사용하기 위한 객체변수선언


        GetServerData.setOnClickListener(new onClickListener() {


            @Override

            public void onClick(View arg0) {


                // 웹서버 접속 URL 설정

                String serverURL = "http://time-space.biz/apk/jsonreturn.php";


                // ANR 문제를 방지하기 위해서 AsyncTask 방식으로 구현 앱 접속시간초과에러 방지

                new LongOperation().execute(serverURL);

            }

        });

        Object obj=getLastNonConfigurationInstance();

        if(obj!=null){

            //화면 방향이 바뀐 것으로 판달할 수 있음.

            //원하는 필드값을 restore

            HashMap data=(HashMap) obj;

            TextView uiUpdate = (TextView) findViewById(R.id.output);//UI화면의 output 객체의 변수선언

            TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed);//UI화면의 jsonParsed Element를 사용하기 위한 객체변수선언

            uiUpdate.setText(data.get(one").toString());

            jsonParsed.setText(data.get("two").toString());


        }

    }


    //*화면회전시 onDestroy(), onCreate()등이 호출 되면서 버퍼가 Clear됩니다. 즉, 기존화면이 사라지는 문제가 있어서 추가.

    @Override

    public Object onRetainNonConfigurationInstance(){

        //HashMap을 이용한 데이터를 저장

        HashMap data=new HashMap();

        TextView uiUpdate = (TextView) findViewById(R.id.output);//UI화면의 output 객체의 변수선언

        TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed);//UI화면의 jsonParsed Element를 사용하기 위한 객체변수선언

        data.put(one",uiUpdate.getText());

        data.put("two",jsonParsed.getText());

        return data;

    }


    // AsyncTask 구현 클래스

    private class LongOperation  extends AsyncTask<String, Void, Void> {


        // 초기화 필요

        //이 클래스에서는 HttpClient 가 아닌 123라인에서 HttpURLConnection 객체(오브젝트)를 사용합니다.

        //private final HttpClient Client = new DefaultHttpClient();//아파치서버클래스에서 변수를 전역으로 사용하기 위해서 final 선언하면서 오브젝트 생성

        private String Content;

        private String Error = null;

        private ProgressDialog Dialog= new ProgressDialog(RestFulWebservice.this);//현재 RestFulWebservice 클래스에 Dialog 변수선언

        String data ="";

        TextView uiUpdate = (TextView) findViewById(R.id.output);//UI화면의 output 객체의 변수선언

        TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed);//UI화면의 jsonParsed Element를 사용하기 위한 객체변수선언

        int sizeData = 0;

        EditText serverText = (EditText) findViewById(R.id.serverText);//UI serverText Element를 사용하기 위한 객체변수선언



        protected void onPreExecute() {

            // 자동으로 실행되는 화면 업데이트 전처리 내용


            //Progress Dialog 시작


            Dialog.setMessage("잠시만 기다려 주세요..");

            Dialog.show();


            try{

                // 요청 파라미터 설정

                data +="&" + URLEncoder.encode("data", "UTF-8") + "="+serverText.getText();


            } catch (UnsupportedEncodingException e) {

                // 에러 표시

                e.printStackTrace();

            }


        }


        // onPreExecute 메소드 이후 호출

        protected Void doInBackground(String... urls) {//클릭이벤트 실행시 파라미터값 urls= LongOperation().execute(serverURL);


            BufferedReader reader=null;


            // 데이터 전송

            try

            {

                // Lab code here....

                //Data를 보낼 URL =

                URL url=new URL(urls[0]);


                //POST data 요청사항을 OutputStreamWriter 를 이용하여 전송

                URLConnection conn=url.openConnection();

                conn.setDoOutput(true);

                OutputStreamWriter wr=new OutputStreamWriter(conn.getOutputStream());

                wr.write(data);//onPreExecute 메소드의 data 변수의 파라미터 내용을 POST 전송명령

                wr.flush();//OutputStreamWriter 버퍼 메모리 비우기


                //PHP 서버 응답값을 변수에 저장

                reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));

                StringBuilder sb=new StringBuilder();

                String line=null;


                //서버 응답변수 reader 에서 내용을 라인단위 문자열로 만듬

                while((line=reader.readLine())!=null){

                    //서버응답값을 String 형태로 추가함

                    sb.append(line+"\n");

                }

                //위 StringBuilder값을 : sb를 Content 변수에 저장함

                Content = sb.toString();

            }

            catch(Exception ex)

            {

                Error = ex.getMessage();

            }

            finally

            {

                try

                {


                    reader.close();

                }


                catch(Exception ex) {}

            }


            /*****************************************************/

            return null;

        }

        //doInBackground POST전송 후 자동실행 코드

        protected void onPostExecute(Void unused) {

            // UI Element 호출 가능


            // progress dialog 종료

            Dialog.dismiss(); //"잠시만 기다려 주세요.. 다이알로그 메세지 창 종료


            if (Error != null) {


                uiUpdate.setText("Output : "+Error);


            } else {


                // 서버 응답변수 reader 에서 내용을 라인단위 문자열 변수 Content 를 화면 UI uiUpdate=output객체에 뿌려줌.

                uiUpdate.setText( Content );


                /****************** JSON Data 파싱 *************/


                String OutputData = "";

                JSONObject jsonResponse;


                try {


                    /****** 문자열 Content변수내용을 JSON Object로 생성 ********/

                    jsonResponse = new JSONObject(Content);


                    // JSONArray에서 항목 이름으로 결과 값 조회

                    JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");


                    // 각각의 JSON Node를 처리/


                    int lengthJsonArr = jsonMainNode.length();//"Android 로 시작하는 서브노드배열의 갯수를 구함


                    for(int i=0; i < lengthJsonArr; i++)

                    {

                        /****** JSON node에서 데이터를 얻어옴***********/

                        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);


                        /******* 노드 밸류에서 값을 얻어옴**********/

                        String name       = jsonChildNode.optString("name").toString();

                        String number     = jsonChildNode.optString("number").toString();

                        String date_added = jsonChildNode.optString("date_added").toString();



                        OutputData += " Name    : "+ name +" \n "

                                + "Number : "+ number +" \n "

                                + "Time : "+ date_added +" \n "

                                +"--------------------------------------------------\n";


                        //Log.i("JSON parse", song_name);

                    }

                    /****************** JSON Data parsing 완료 *************/


                    // 파싱된 결과값을 화면 UI jsonParsed객체에 뿌림줌

                    jsonParsed.setText( OutputData );



                } catch (JSONException e) {


                    e.printStackTrace();

                }



            }

        }


    }


}


=========================jsonreturn.php 서버쪽 파일전문 ============================================

<?php 

header('Content-Type: text/html; charset=UTF-8');

// Get Post Data

$data = urldecode($_POST['data']);

$jsonData      = array();

$jsonTempData  = array();

 

for($i=1;$i<4; $i++)

  {

 $jsonTempData = array();

 $jsonTempData['name'] = $data.$i;

 $jsonTempData['number'] = $data.$i;

 $jsonTempData['date_added'] = $data.$i;

 

 $jsonData[] = $jsonTempData;

  }

$outputArr = array();

$outputArr['Android'] = $jsonData;

 

// Encode Array To JSON Data

print_r(json_encode($outputArr));

//출력결과 예 {"Android":[{"name":"1","number":"1","date_added":"1"},{"name":"2","number":"2","date_added":"2"},{"name":"3","number":"3","date_added":"3"}]} 

 ?>

HangulKeyboard.apk
0.06MB
RestFulWebservice.java
0.01MB
rest_ful_webservice.xml
0.0MB

관련글 더보기

댓글 영역