2016-08-22 4 views
2

Я пытаюсь получить данные ответа запроса Http. Мой код выглядит следующим образом:Android HttpURLConnection wierd response

public class Networking { 

    // private variables 
    private URL mUrl; 
    private InputStream mInputStream; 

    public void Networking() {} 

    public InputStream setupConnection(String urlString) { 

     // public variables 
     int connectionTimeout = 10000; // milliseconds 
     int readTimeout = 15000; // milliseconds 

     try { 
      mUrl = new URL(urlString); 

      try { 
       // initialize connection 
       HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection(); 

       // setup connection 
       connection.setConnectTimeout(connectionTimeout); 
       connection.setReadTimeout(readTimeout); 
       connection.setRequestMethod("GET"); 
       connection.setDoInput(true); 

       // start the query 
       try { 
        connection.connect(); 
        int response = connection.getResponseCode(); 

        if (response == 200) { 
         // OK 
         mInputStream = connection.getInputStream(); 
         return mInputStream; 

        } else if (response == 401) { 
         // Unauthorized 
         Log.e("Networking.setupConn...", "unauthorized HttpURL connection"); 
        } else { 
         // no response code 
         Log.e("Networking.setupConn...", "could not discern response code"); 
        } 
       } catch (java.io.IOException e) { 
        Log.e("Networking.setupConn...", "error connecting"); 
       } 


      } catch (java.io.IOException e) { 
       Log.e("Networking.setupConn...", "unable to open HTTP Connection"); 
      } 
     } catch (java.net.MalformedURLException e) { 
      Log.e("Networking.setupConn..", "malformed url " + urlString); 
     } 

     // if could not get InputStream 
     return null; 
    } 

    public String getStringFromInputStream() { 
     BufferedReader br = null; 
     StringBuilder sb = new StringBuilder(5000); 
     String line; 

     try { 
      br = new BufferedReader(new InputStreamReader(mInputStream), 512); 
      while ((line = br.readLine()) != null) { 
       sb.append(line); 
      } 
     } catch (java.io.IOException e) { 
      Log.e("BufferReader(new ..)", e.toString()); 
      return null; 
     } finally { 
      if(br != null) { 
       try { 
        br.close(); 
       }catch (java.io.IOException e) { 
        Log.e("br.close", e.toString()); 
       } 
      } 
     } 
     return sb.toString(); 
    } 
} 

Проблема заключается в том, что функция getStringFromInputStream всегда возвращает строку, которая имеет длину 4063 байт. ВСЕГДА! Независимо от того, что URL.

я проверил, и (line = br.readLine()) часть кода всегда возвращает строку фиксированной длины 4063.

Я не понимаю этого. Пожалуйста помоги.

+0

что является содержание? Кажется, вам не хватает шага, на котором вы добавляете строку, считываемую в StringBuffer. –

+0

@BrettOkken, который был по ошибке (при копировании, вставляющем код в вопрос). Я добавил строку 'sb.append (строка)'. Но код не работает. – ironstein

+1

Это означает, что ответ всегда один и тот же. Почему вы находите это удивительным? Что такое * * содержание? NB 'connection.setRequestMethod (" GET ")' и 'connection.setDoInput (true)' просто утверждают значения по умолчанию. Они не делают ничего полезного. И когда вы получите исключение, запишите исключение. Не какое-то сообщение о вашем собственном проекте. Вам нужно будет вернуться позже и исправить это, чтобы отладить их, поэтому исправьте это сейчас. – EJP

ответ

-1

Это мой код, который работает для меня:

public String getDataFromUrl(String httpUrlString) 
      URL url = new URL(httpUrlString); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 
      responseCode = urlConnection.getResponseCode(); 
      if (responseCode != HttpStatus.SC_OK) { 
        return null; 
      } else { // success 
       BufferedReader in = null; 
       StringBuffer str = new StringBuffer(); 
       try { 
        in = new BufferedReader(new InputStreamReader(
          urlConnection.getInputStream())); 
        String inputLine; 
        while ((inputLine = in.readLine()) != null) { 
         str.append(inputLine); 
        } 
       } finally { 
        if (null != in) { 
         in.close(); 
        } 
        urlConnection.disconnect(); 
       } 
       return str.toString(); 
      } 
} 
-1

На мой взгляд, это может быть полезно для вас, если вы используете библиотеку для запроса HTTP. Я могу предложить retrofit или volley.

Кроме того, вы можете просто попробовать другие методы, чтобы получить строку из InputStream, есть интересный ответ для этого here

Тот, который я использовал это

BufferedInputStream bis = new BufferedInputStream(inputStream); 
ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
int result = bis.read(); 
while(result != -1) { 
    buf.write((byte) result); 
    result = bis.read(); 
} 
return buf.toString(); 
Смежные вопросы