차근차근/Android

안드로이드에서 post로 서버에 데이터 전송하기

예쁜꽃이피었으면 2014. 8. 28. 11:27

http://beadgrip.tistory.com/


1. 알아두기

HttpClient 객체를 이용하여 웹에 접속시키고 웹의 내용을 휴대폰으로 전송받는 예제입니다.

웹의 내용은 html일수도 있고, XML, JSON 등등 다양한 데이터가 될 수 있겠죠.

HttpURLConnection 객체를 이용할 수도 있겠지만 개인적으로는 더 많이 사용되는

HttpClient 의 손을 들어주고 싶습니다.



2. 코드

메인 클래스 이름은 따로 정하지 않았는데요 안드로이드 ICS 이상부터는 웹 접속과 관련된

작업은 메인스레드에서 진행할 시 FC가 일어나게 되니 부디 onCreate에서 진행하지 말고

예제와 같이 Handler나 AsyncTask를 이용하여 진행하길 바랍니다.

아래 코드의 예제를 실행시키려면 onCreate() 메소드 내에서 new SendPost().execute(); 를 넣으시면 됩니다.

 

private class SendPost extends AsyncTask<Void, Void, String> {
		protected String doInBackground(Void... unused) {
			String content = executeClient();
			return content;
		}

		protected void onPostExecute(String result) {
			// 모두 작업을 마치고 실행할 일 (메소드 등등)
		}
		
		// 실제 전송하는 부분
		public String executeClient() {
			ArrayList<NameValuePair> post = new ArrayList<NameValuePair>();
			post.add(new BasicNameValuePair("id", "leejay"));
			post.add(new BasicNameValuePair("pw", "1234"));

			// 연결 HttpClient 객체 생성
			HttpClient client = new DefaultHttpClient();
			
			// 객체 연결 설정 부분, 연결 최대시간 등등
			HttpParams params = client.getParams();
			HttpConnectionParams.setConnectionTimeout(params, 5000);
			HttpConnectionParams.setSoTimeout(params, 5000);
			
			// Post객체 생성
			HttpPost httpPost = new HttpPost("연결할 웹 주소");
			
			try {
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(post, "UTF-8");
				httpPost.setEntity(entity);
				client.execute(httpPost);
				return EntityUtils.getContentCharSet(entity);
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}
}

 

3. 설명

=> ArrayList<NameValuePair> post = new ArrayList<NameValuePair>();
아파치 라이브러리에서 제공되는 데이터 형식의 객체입니다.

키와 값의 쌍으로 이루어져 있습니다.

 

=> post.add(new BasicNameValuePair("id", "leejay"));

해당 BasicNameValuePair클래스의 생성자 형식으로

실질적으로 우리가 알고있는 전송되는 데이터를 담는 부분입니다.

HTML로 대응하자면 <input type="text" name='id">leejay</input> 가 될 수 있겠죠

 

=> HttpConnectionParams.setConnectionTimeout(params, 5000);
=> HttpConnectionParams.setSoTimeout(params, 5000);

각각 서버 접속 시간에 대한 정보를 설정하는 부분 입니다.

두번째 인자값은 1초 = 1000 으로 계산해서 넣어주시면 됩니다.

 

두 메소드는 약간의 차이가 있습니다.
setConnectionTimeout() 메소드는 웹과 접속을 하고 답변을 받는데 응답이이 없으면

(예제에 따르면) 5초 뒤에끊는다는 것이고

setSoTimeout() 메소드는 클라이언트 객체에 일정 시간 (5초)동안 패킷이 없을 겨우

끊는다는 것 입니다.

그러므로 catch 문에 해당 클래스를 추가 함으로써 걸래낼 수 있습니다.

 

예를 하나 들어봅시다. 웹에서 XML을 가져와 파싱을 하기위해 작업을 한다고 가정해 봅시다.

하지만 사용자가 인터넷 사용을 중지하여 (와이파이나 3G가 원할하지 않아도...)

예상대로라면 XML에 'pepsi' 라는 엘리먼트가 있어야 하는데 이자식이 null 값을 반환 한다면

당연히 강제 종료가 되겠지요.

 

그러므로 각 catch문을 추가하여, 예를들어 

catch (ConnectionTimeout e) { 

이 안에 적절히 XML내용을 담아 리턴하여

에러가 나지 않게 구조적으로  예방할 수 있습니다.

}

 

>> client.execute(httpPost);

메소드명을 보시면 아시겠지만, 실제로 접속시킨다! 하는 부분입니다.

반응형