두 개의 다른 Android OS, v2.3 및 v4.0에서 HttpPost 메서드의 출력을 비교하는 샘플 코드를 만들었습니다. 나는 통신 수의 3G 서비스를 사용하고있는 sim 카드를 가지고있다. 따라서 3G 서비스를 통해 인터넷에 연결하고 있습니다. 프록시 서버 주소와 포트는 이동 통신 사업자가 자동으로 설정하며 두 가지 모두 동일합니다.안드로이드, HttpPost 메소드가 안드로이드 v2.3과 안드로이드 v4.0.3에서 두 가지 다른 결과를 반환하는 이유는 무엇입니까?
내 코드는 다음과 같다 :
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "inside onCreate()...");
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo();
if (activeNetwork != null) {
Log.i(TAG, "Internet connection found.");
new MyAsyncTask().execute();
} else
Log.i(TAG, "Internet connection not found.");
}
private class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute()...");
}
@Override
protected Boolean doInBackground(Void... arg0) {
boolean status = false;
String xml = postData();
if(xml != null)
status = true;
return status;
}
@Override
protected void onPostExecute(Boolean result) {
if (result)
Log.i(TAG, "Process finished successfully...");
}
}
private String postData() {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("u", Uri.encode("test01")));
nameValuePairs.add(new BasicNameValuePair("p", Encryption.encrypt("112233")));
nameValuePairs.add(new BasicNameValuePair("v", "1.1"));
nameValuePairs.add(new BasicNameValuePair("t", "0"));
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Log.i("Requestd Connection", httppost.getURI().toString());
HttpResponse response = httpClient.execute(httppost);
String responseBody = EntityUtils.toString(response.getEntity());
Log.i("Server Response: ", responseBody);
if (response.containsHeader("Set-Cookie")) {
String sessionId = extractSessionId(response.getHeaders("Set-Cookie")[0].getValue());
// PropertyManager.setSessionID(sessionId);
Log.i("Session Id:", sessionId);
} else
Log.e("ERROR", "Response doesn't have Set-Cookie in header");
return responseBody;
} catch(UnsupportedEncodingException usee) {
usee.printStackTrace();
} catch(ClientProtocolException cpe) {
cpe.printStackTrace();
} catch(IOException ioe) {
ioe.printStackTrace();
}
return null;
}
private String extractSessionId(String str) {
String session = null;
if (str!=null)
session = str.substring(0, str.indexOf(";"));
return session;
}
}
나는 안드로이드 V2.3 장치 (삼성 갤럭시 S)에이 응용 프로그램을 실행할 때, 내 출력은 로그 캣이 같다 :
07-09 18:21:11.031: I/MainActivity(1277): inside onCreate()...
07-09 18:21:11.035: I/MainActivity(1277): Internet connection found.
07-09 18:21:11.035: I/MainActivity(1277): onPreExecute()...
07-09 18:21:11.718: I/Requestd Connection(1277): http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?
07-09 18:21:13.941: I/Server Response:(1277): <TD ID="LGFLAG">S</TD><TD ID="LGMSG"></TD><TD ID="CLNT_0">CLNTXXX,EF TEST,C,001,</TD>
07-09 18:21:13.941: I/Session Id:(1277): ASPNETSESSIONID=jjodj3m22notn1m50oxs0u55
07-09 18:21:13.941: I/MainActivity(1277): Process finished successfully...
동안 나는 안드로이드 V4.0.3 (삼성 갤럭시 2, HTC 엑스 페리아)에서 응용 프로그램을 실행할 때, 출력은 로그 캣이 같다 :
07-09 18:08:45.085: I/MainActivity(19358): inside onCreate()...
07-09 18:08:45.090: I/MainActivity(19358): Internet connection found.
07-09 18:08:45.090: I/MainActivity(19358): onPreExecute()...
07-09 18:08:45.155: I/Requestd Connection(19358): http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?
07-09 18:08:46.235: I/Server Response:(19358): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
07-09 18:08:46.235: I/Server Response:(19358): "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
07-09 18:08:46.235: I/Server Response:(19358): <html xmlns="http://www.w3.org/1999/xhtml">
07-09 18:08:46.235: I/Server Response:(19358): <head>
07-09 18:08:46.235: I/Server Response:(19358): <title></title>
07-09 18:08:46.235: I/Server Response:(19358): </head>
07-09 18:08:46.235: I/Server Response:(19358): <body>
07-09 18:08:46.235: I/Server Response:(19358): <table>
07-09 18:08:46.235: I/Server Response:(19358): <tr>
07-09 18:08:46.235: I/Server Response:(19358): <td id="LGFLAG">S</td>
07-09 18:08:46.235: I/Server Response:(19358): <td id="LGMSG"></td>
07-09 18:08:46.235: I/Server Response:(19358): <td id="CLNT_0">CLNTXXX,EF TEST,C,001,</td>
07-09 18:08:46.235: I/Server Response:(19358): </tr>
07-09 18:08:46.235: I/Server Response:(19358): </table>
07-09 18:08:46.235: I/Server Response:(19358): </body>
07-09 18:08:46.235: I/Server Response:(19358): </html>
07-09 18:08:46.235: E/ERROR(19358): Response doesn't have Set-Cookie in header
07-09 18:08:46.440: I/MainActivity(19358): Process finished successfully...
당신이 볼 수 있듯이 내 XML 데이터는 HTML 코드에 의해 래핑됩니다. 이 HTML 코드는 어디에서 유래합니까? 누군가가 모바일 운영자가 자동으로 설정 한 프록시 서버 때문일 수 있습니다. 맞습니까? 프록시 서버가 내 코드를 조작하거나 v4.0.3에서 내 코드에 무엇인가를 주입하면 안드로이드 v2.0 및 v3.0과 동일한 응답이 없기 때문에 정확하지 않아야한다고 생각합니다. Android v4.0의 버그 때문입니까? !!!
의견을 보내 주시면 감사하겠습니다.
안드로이드 2.x와 4.x에서 서버에 의해 다르게 처리되는 요청에 차이가 있다고 생각합니다. – pawelzieba
'pawelzieba'에 동의합니다 ... 제출하신 헤더는 무엇입니까? 서버는 분명히 다른 것을 수신하고 있습니다. 헤더는 확인하기 좋은 곳이 될 것입니다 (간단히 콜렉션으로 반복합니다). – BonanzaDriver