마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 URLconnection 질문입니다.

0 추천
안녕하세요.

httpurlconnection 중에 서버에서 에러가 발생하면  에러 메세지를 떨어뜨려 주는데

안드로이드 소스에서는

'OutputStream out = new BufferedOutputStream(conn.getOutputStream());'에서

더 정확히는 'conn.getOutputStream()'에서 catch문으로 빠져 나가더라구요.. 서버에서 에러가 발생해도 json 방식으로 떨어뜨려주도록 했는데 conn.getResponseMessage()에는 null이 들어있네요..

 

어떻게 확인할 수 있을까요??
행인28 (480 포인트) 님이 2016년 5월 24일 질문

1개의 답변

0 추천
아래와 같이 에러인 경우와 아닌경우를 나눠서 처리하면 될것 같네요.
에러인 경우 응답코드를 가져와서 처리해야합니다 
try
         {
            inputStream = urlConn.getInputStream();
         }
         catch (IOException ioe)
         {
            urlConn.disconnect();
            
            // If HTTP response code '401' is returned then try to resume the expired
            // session on the reporting server by obtaining a new HTTP URL Connection.
            if (urlConn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED)
            {
               throw new ClusterException("The access to the requested resource was denied; the request may have been made without authorization credentials.");
            }
            // If response code other than '401' is returned then propagate the IOException to the next level.
            else
            {
               throw new ClusterException(ioe.getMessage());
            }
         }
라쎄린드 (25,460 포인트) 님이 2016년 5월 24일 답변
제 소스가

int HttpResult =conn.getResponseCode();  
            if(HttpResult ==HttpURLConnection.HTTP_OK){  
                
                InputStream in = new BufferedInputStream(conn.getInputStream());
                readStream = new InputStreamReader(in,"UTF-8");
               
                BufferedReader br = new BufferedReader(readStream);
                String line;
                StringBuilder sb = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }       
               
                result = sb.toString();
                Log.i("GetDataFromDB", result);
                  

            }else{  
~~~

이렇게 되어있는데 getresponseCode()를 빼고 inputStream을 먼저 해야하나요~?
보내주신 소스에는 물어보신 outputStream쪽 소스가 없는걸로 봐서는  200ok조차 안떨어진것 같은데요..? else문 쪽 소스를 보여주셔야할듯 합니다.
하지만 저기서 getResponseCode() 조차 에러가 나서 catch문으로 가더라구요...
서버에서 에러가 발생하더라도 조취를 해준 후 return을 시키면 계속 넘어가야하는건 맞나요..?

webservice부분 통으로 적어보겠습니다.


public String webService(Object inObj, String serviceName) throws IOException {
        URL url = null;
        HttpURLConnection conn = null;
        String result = null;
        try {
            // url = new URL("http://172.16.61.40:51011/" + serviceName);
            // url = new URL("http://172.16.61.165/EzForm.SOA/" + serviceName);
            url = new URL("http://172.17.78.134/" + serviceName);
            // url = new URL("http://172.16.61.12/EzForm.SOA/" + serviceName);

            OutputStreamWriter writeStream;
            InputStreamReader readStream;

            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.connect();

            conn.setRequestProperty("Cache-Control", "no-cache");
            conn.setRequestProperty("Accept-Charset", "UTF-8");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("HSP_TP_CD", "00001");
            conn.setRequestProperty("HSPI_TP_CD", "01");
            conn.setRequestProperty("MLNG_TP_CD", "1042");
            conn.setRequestProperty("PRGM_ID", "Andoroid");
            conn.setRequestProperty("IP_ADDR", "localhost");
            conn.setRequestProperty("TYPE", "ANDROID");
            conn.setRequestProperty("VER", "1.0");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // conn.setChunkedStreamingMode(0);
            // Server에 연결되는 시간 Timeout
            conn.setConnectTimeout(10000); // 시간 늘려야 함.
            // Input을 읽어올 때 걸리는 시간
            conn.setReadTimeout(10000);

            OutputStream out = new BufferedOutputStream(conn.getOutputStream());
            out.write(inObj.toString().getBytes());
            out.flush();

            // int HttpResult =conn.getResponseCode();
           

                InputStream in = new BufferedInputStream(conn.getInputStream());
                readStream = new InputStreamReader(in, "UTF-8");

                BufferedReader br = new BufferedReader(readStream);
                String line;
                StringBuilder sb = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }

                result = sb.toString();
                Log.i("GetDataFromDB", result);

        } catch (Exception e) {
            if (conn instanceof HttpURLConnection) {
                HttpURLConnection httpConn = (HttpURLConnection) conn;
                int statusCode = httpConn.getResponseCode();
                if (statusCode != 200) {

                }
            }
            result = "-1::서비스 연결 실패. 잠시 후 다시 시도해주세요.";

        } finally {
            if (conn != null)
                conn.disconnect();
        }
        return result;
    }
...