2012-07-09 2 views
4

두 개의 다른 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의 버그 때문입니까? !!!

의견을 보내 주시면 감사하겠습니다.

+0

안드로이드 2.x와 4.x에서 서버에 의해 다르게 처리되는 요청에 차이가 있다고 생각합니다. – pawelzieba

+0

'pawelzieba'에 동의합니다 ... 제출하신 헤더는 무엇입니까? 서버는 분명히 다른 것을 수신하고 있습니다. 헤더는 확인하기 좋은 곳이 될 것입니다 (간단히 콜렉션으로 반복합니다). – BonanzaDriver

답변

0

요청에 대해 수신 할 수있는 수신 유형이 누락 된 것 같습니다. 다음에 로그온 아파치 HttpClient를 설정하지 않으면

httppost.setHeader("Accept","application/xml"); 

:

봅니다 같은 것을 추가하는
https://stackoverflow.com/a/3303131/538169
와 요청의 차이를 찾습니다.

+0

감사합니다. pawelzieba,이 헤더 설정으로 인해 생각하지 않습니다. 왜냐하면, 내가 수동으로 프록시 서버 IP와 휴대 전화에서 포트를 지울 때, 응용 프로그램이 문제없이 잘 작동하기 때문에. 프록시 서버를 통해 인터넷을 사용하고 OS가 v4.0 인 경우 XML 데이터가 HTML 코드로 묶입니다. 나는 안드로이드 v2.0 또는 v3.0에 포장하지 않는 동안 왜 프록시 서버 안드로이드 v4.0에서 내 데이터를 포장 모르겠다! 그것은 나를 미치게하고있다 !!!!! – Hesam

+0

나는 HttpClient loggin을 켜고 요청의 차이가 어디에 있는지 살펴볼 것을 제안한다. 나는 서버가 ICS와 구형 시스템의 요청을 다르게 해석한다고 거의 확신한다. 아마도 ICS 구현은 이전 API에 있던 일부 헤더를 기본적으로 설정 또는 설정 해제합니다. – pawelzieba