안드로이드에서 Tworld로그인을 해서 특정페이지를 TextView에 가져 오려고 합니다.
Tworld 로그인 예저는 http://mudchobo.tistory.com/479 사이트에 찾아서 자바콘솔에서 정상적으로 출력이 되는것을 확인 했습니다.
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class Main {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
HttpClient httpclient = new DefaultHttpClient();
String id = "t월드 아이디";
String pw = "비밀번호";
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("URL", "http://www.tworld.co.kr/loginservlet.do?returnURL=http%3A%2F%2Fwww.tworld.co.kr&kind=&popup=&cmd=&reload=&ID=" + id));
qparams.add(new BasicNameValuePair("ID", id));
qparams.add(new BasicNameValuePair("PASSWORD", pw));
qparams.add(new BasicNameValuePair("SERVERIP", "203.236.20.129"));
qparams.add(new BasicNameValuePair("X", "0"));
qparams.add(new BasicNameValuePair("Y", "0"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(qparams, "UTF-8");
HttpPost httpPost = new HttpPost("http://nicasams.sktelecom.com:2040/icas/fc/LogOnSV");
httpPost.setEntity(entity);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
HttpResponse response = httpclient.execute(httpPost);
Header[] headers = response.getAllHeaders();
httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet();
if (headers.length > 1){
String url = headers[1].getValue();
System.out.println("url = " + url);
httpGet.setURI(new URI(url));
responseBody = httpclient.execute(httpGet, responseHandler);
System.out.println(responseBody);
}
httpGet.setURI(new URI("http://www.tworld.co.kr/normal.do?serviceId=S_BILL0070&viewId=V_CENT0261"));
responseBody = httpclient.execute(httpGet, responseHandler);
System.out.println("result = " + responseBody);
}
}
그래서 이 예제 그대로 안드로이드에 적용시켜봤습니다.
Button 하나를 만들고 그 버튼을 누르면 그 버튼 화면 아래에 있는 TextView에 결과 페이지가 나타나도록 구성했습니다.
하지만 버튼을 누르는 순간 오류를 나타내며 종료가 됩니다.
소스는 아래와 같습니다.
package com.kyungwon.login;
import java.io.*;
import java.net.*;
import java.util.*;
import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.entity.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.message.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;
public class Login_testActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.button1);
final TextView result_page = (TextView)findViewById(R.id.textView1);
View.OnClickListener clicked_confirm = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
HttpClient httpclient = new DefaultHttpClient();
String id = "test_id";
String pw = "test_pw";
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("URL", "http://www.tworld.co.kr/loginservlet.do?returnURL=http%3A%2F%2Fwww.tworld.co.kr&kind=&popup=&cmd=&reload=&ID=" + id));
qparams.add(new BasicNameValuePair("ID", id));
qparams.add(new BasicNameValuePair("PASSWORD", pw));
qparams.add(new BasicNameValuePair("SERVERIP", "203.236.20.129"));
qparams.add(new BasicNameValuePair("X", "0"));
qparams.add(new BasicNameValuePair("Y", "0"));
UrlEncodedFormEntity entity = null;
try {
entity = new UrlEncodedFormEntity(qparams, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
HttpPost httpPost = new HttpPost("http://nicasams.sktelecom.com:2040/icas/fc/LogOnSV");
httpPost.setEntity(entity);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
HttpResponse response = null;
try {
response = httpclient.execute(httpPost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Header[] headers = response.getAllHeaders();
httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet();
if (headers.length > 1){
String url = headers[1].getValue();
//System.out.println("url = " + url);
result_page.setText(url);
try {
httpGet.setURI(new URI(url));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
responseBody = httpclient.execute(httpGet, responseHandler);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(responseBody);
}
try {
httpGet.setURI(new URI("http://www.tworld.co.kr/normal.do?serviceId=S_BILL0070&viewId=V_CENT0261"));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
responseBody = httpclient.execute(httpGet, responseHandler);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
btn.setOnClickListener(clicked_confirm);
}
}디버그 모드를 통해 로그캣의 내용은 아래와 같습니다.
08-31 21:31:11.119: WARN/dalvikvm(3542): threadid=1: thread exiting with uncaught exception (group=0x40017568)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): FATAL EXCEPTION: main
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): java.lang.NullPointerException
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:626)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at com.kyungwon.login.Login_testActivity$1.onClick(Login_testActivity.java:84)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.view.View.performClick(View.java:2486)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.view.View$PerformClick.run(View.java:9130)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.os.Handler.handleCallback(Handler.java:587)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.os.Handler.dispatchMessage(Handler.java:92)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.os.Looper.loop(Looper.java:130)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at android.app.ActivityThread.main(ActivityThread.java:3694)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at java.lang.reflect.Method.invokeNative(Native Method)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at java.lang.reflect.Method.invoke(Method.java:507)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
08-31 21:31:11.155: ERROR/AndroidRuntime(3542): at dalvik.system.NativeStart.main(Native Method)
08-31 21:31:11.178: WARN/ActivityManager(1808): Force finishing activity com.kyungwon.login/.Login_testActivity
08-31 21:31:11.686: WARN/ActivityManager(1808): Activity pause timeout for HistoryRecord{406f00b0 com.kyungwon.login/.Login_testActivity}
만약에 제가 post값을 잘못 넣었다고 하더라도 오류값이 textview에 나타야 할 것 같은데 그대로 죽어버립니다.
제가 무엇을 잘못 했을까요?




다시 자세히 살펴보니깐 자바에서 처리 할때와 안드로이드에서 처리할때 header값을 얻어오는게 다르군요.
왜 그런지 모르겠네요.