2014-05-24 3 views
0

Я использую этот код для извлечения данных из URL с помощью AsyncTask:Как я могу получить длину контента из заголовка ответов?

protected String doInBackground(Object... params) { 
    int ResponseCode=-1; 
    try { 
     URL myURL=new URL("URL..."); 
     HttpURLConnection connection=(HttpURLConnection) myURL.openConnection(); 
     connection.connect(); 
     ResponseCode=connection.getResponseCode(); 

     if (ResponseCode==HttpURLConnection.HTTP_OK) { 
      InputStream inputStream=connection.getInputStream(); 
      Reader reader=new InputStreamReader(inputStream); 
      int contentLength=connection.getContentLength(); 
      char[] charArray=new char[contentLength]; 
      reader.read(charArray); 
      String responseData=new String(charArray); 
      Log.i("TAG", responseData); 
      Log.i("TAG", ""+contentLength); 
     } 
     else { 
      Log.i("TAG", " Unsuccessful HTTP Response Code: "+ResponseCode); 
     } 

    }catch (MalformedURLException e) { 
      Log.i("TAG", "MalformedURLException Error: "+e.getMessage()); 
    } catch (IOException e) { 
      Log.i("TAG", "IOException Error: "+e.getMessage()); 
    } catch (Exception e) { 
      Log.i("TAG", "Exception Error: "+e); 
    } 
    return " "+ResponseCode; 
} 

выше код работает отлично, и я использую его в некоторых проектах, но для URL, что я работаю, это не работать и всегда возвращать -1 для Response Code, because the HTTP response of my URL doesn't contain Content-Length header, the content is chunked., теперь я хочу знать Есть ли эквивалентный способ сделать это?
Благодаря передовому

+1

** «... Есть ли эквивалентный способ сделать это?» **: Совершенно просто, нет. Если вы не загрузите все это и не проверите длину, это невозможно. Единственная небольшая возможность заключается в том, что вы контролируете код на стороне сервера и добавляете ответ «Content-Length» или некоторый способ запроса длины. – Squonk

+0

Спасибо, но сервер не в моем распоряжении. –

ответ

0

я, наконец, решить мою проблему таким образом:

try { 
    URL blogPostURL=new URL("URL..."); 
    URLConnection connection=blogPostURL.openConnection(); 
    BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    String responseData; 
    while ((responseData = reader.readLine()) != null){ 
      Log.i("TAG", responseData); 
    } 
    reader.close(); 
}catch (MalformedURLException e) { 
    Log.i("TAG", "MalformedURLException Error: "+e.getMessage()); 
} catch (IOException e) { 
    Log.i("TAG", "IOException Error: "+e.getMessage()); 
} catch (Exception e) { 
    Log.i("TAG", "Exception Error: "+e); 
} 
+0

Это значит, что вы решили, что вас не волнует длина? Кроме того, этот код предполагает, что ответ находится в кодировке по умолчанию для ОС. Вы должны посмотреть значение Content-Type в заголовке ответа, чтобы определить кодировку символов. Вы можете использовать http://docs.guava-libraries.googlecode.com/git-history/v17.0/javadoc/com/google/common/net/MediaType.html из guava, чтобы помочь разобрать атрибут charset. –

0

После HTTP-спецификации, если типа содержимого фрагментированная длина содержания можно прочитать на поток после заголовка «Transfer-Encoding». Это выглядит следующим образом:

HTTP/1.1 200 OK 
Date: Fri, 23 May 2014 21:17:12 GMT 
Content-Type: text/plain 
Transfer-Encoding: chunked 

5F 

Здесь «5F» длина в шестигранную ответ HTTP с этого момента (в данном случае 95 байт).

Обратите внимание, что после заголовка и перед длиной указана новая строка.

Для получения дополнительной информации:

Простое объяснение протокола HTTP: http://www.jmarshall.com/easy/http/#http1.1c2 RFC (официальный, один полный): http://tools.ietf.org/html/rfc2616

Смежные вопросы