일명 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개를 첨부파일로 추가해 보겠습니다.
(위 설치 파일은 안드로이드 가상기기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"}]}
?>
안드로이드 액티비티 전체화면으로 보기(타이틀바까지 숨기기) (0) | 2015.03.25 |
---|---|
안드로이드 프로젝트 복사하기 (0) | 2015.03.15 |
간단한 쓰레드 서비스 실행과 Thread 서비스중지시키기 (0) | 2015.02.26 |
안드로이드에서 패키지명의 의미 (0) | 2015.01.20 |
안드로이드 스튜디오1.01 Default Activity Not Found 메세지문제는 (0) | 2015.01.19 |
댓글 영역