'Android에서 HttpClient를 이용한 서버와의 통신'에 해당되는 글 1건

  1. 2010.07.30 Android에서 HttpClient를 이용한 서버와의 통신
04.Anddoid2010. 7. 30. 14:17
반응형




Unblocking Android RetuarantFinder 에서는 서버에 xml 파일을 요청하여 받은 그 파일을 SAX를 이용하여 Parsing 하는 방법을 제공하고 있다.





그러나 서버에서 xml 파일을 가져오는 방법이 단순히 URL Class를 생성하여 파서에서 InputStream을 읽어 파싱하는 방식으로 하기 때문에

URL url = new URL(this.query);
xr.parse(new InputSource(url.openStream()));
http Connection 시 좀더 세밀한 동작을 하거나 제한을 둘때에는 (예를 들면 일정시간 정도 서버로 부터 응답이 없을 경우에는 Timeout Exception 발생하는 경우) 이러한 방법으로는 해결할 수가 없다.

대안으로는HttpClient를 이용하여 해결 할 수가 있다.
관련 Site는

http://hc.apache.org/httpcomponents-client/tutorial/html/ 를 참조하면 되는 데

목차를 보면

○ Http Request
○ Http Reponse
○ Http Entity
○ Http Content
○ Exception Handling
○ Http Parameter Setting
○ Connection Manager
○ Cookie
○ Http Authentication

으로 되어 있다.
내 생각에는 실제로 사용하려면 HttpClient를 사용해야 되지 않을까 하는 생각이 든다.
어쩌든 내 경우에는 Http Paramter를 Setting하여 Timeout을 주고자 하는 목적이기
때문에 HttpClient를 생성하고 Setting하고 실행하여 InputStream을 가져오는 로직으로 수정하여다. (아래 Flow 참조)


 
SAX Paser 정의 및 Parsing을 위한 Handler Setting

   public ArrayList<MCTH> getReviews() {
        long startTime = System.currentTimeMillis();
        ArrayList<MCTH> results = null;    
           
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp;
   try {
    sp = spf.newSAXParser();
             XMLReader xr = sp.getXMLReader();

             mcthHandler handler = new mcthHandler();
             xr.setContentHandler(handler);

             //xr.parse(new InputSource(url.openStream()));
             xr.parse(new InputSource(getInputStreamFromURI()));
             // after parsed, get record
             results = handler.getReviews();        
   
   } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }  

        long duration = System.currentTimeMillis() - startTime;
        Log.v(TAG," call and parse duration - " + duration);
        return results;
    }


  HttpClient를 이용하여 서버로 부터 XML 파일의 InputStream을 가져오는 부분
  public InputStream getInputStreamFromURI() {
     InputStream result = null;
     URI uri = null;    
       
  try {
     uri = URIUtils.createURI(URI_SCHEME, URI_HOST, URI_PORT, URI_PATH, URIQuery, null);       
        
         // Http parameter setting
         HttpParams hp = new BasicHttpParams();
         // Http Timeout
         HttpConnectionParams.setConnectionTimeout(hp,10000);
        
         // Create an instance of HttpClient.
         HttpClient hc = new DefaultHttpClient(hp);
        
         // Socket Timeout
         HttpConnectionParams.setSoTimeout(hp,10000);
        
         // Create a method instance.
         HttpGet hm = new HttpGet(uri);
        
         Log.v(TAG,"URI ==> " + hm.getURI());
        
         // Create an instance HttpResponse
         HttpResponse hr = null;
        
         //Execute the request
         hr = hc.execute(hm);
                  
        // Examine the response status
            Log.i(TAG,"hc ===> " + hr.getStatusLine().toString());
           
            // Get hold of the response entity
            HttpEntity he = hr.getEntity();
        
            if (he != null)
            {
             result = he.getContent();    
             Log.v(TAG,"xml file size is " + Long.toString(he.getContentLength()));
            }     
           
  } catch (URISyntaxException e1) {
   // TODO Auto-generated catch block
   Log.v(TAG,"getInputStreamFromURI URISyntaxException");
   e1.printStackTrace();
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   Log.v(TAG,"getInputStreamFromURI ClientProtocolException");
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   Log.v(TAG,"getInputStreamFromURI IOException" + e.getMessage());
   e.printStackTrace();
  }             
     return result;    
   }



출처 : http://blog.naver.com/kippee/130068924726


Posted by 1010