2014-05-24 75 views
0

我使用這個代碼使用AsyncTask獲取從URL數據:如何從響應頭獲取內容長度?

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; 
} 

上面的代碼工作正常,我使用它的一些項目,但網址我的工作,它不工作和總是返回-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

也就是說你決定不關心這個長度?此外,此代碼假定響應採用OS的默認字符編碼。您應該查看響應頭中的Content-Type值以確定字符編碼。您可以使用來自番石榴的http://docs.guava-libraries.googlecode.com/git-history/v17.0/javadoc/com/google/common/net/MediaType.html幫助解析出字符集屬性。 –

0

繼HTTP規範,如果內容類型分塊的內容長度可以在標題「傳送編碼後」的流中讀取。它看起來像這樣:

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

相關問題