2012-01-13 22 views
9

Trong mã của tôi, tôi sử dụng một số Http Nhận yêu cầu tải xuống một số tệp dưới dạng luồng. Tôi sử dụng mã sau:HTTP Get: Chỉ tải xuống tiêu đề? (HEAD không được hỗ trợ)

public String getClassName(String url) throws ClientProtocolException, IOException { 
     HttpResponse response = sendGetRequestJsonText(url); 

     Header[] all = response.getAllHeaders(); 
     for (Header h : all) { 
      System.out.println(h.getName() + ": " + h.getValue()); 
     } 

     Header[] headers = response.getHeaders("Content-Disposition"); 
     InputStreamParser.convertStreamToString(response.getEntity().getContent()); 
     String result = ""; 
     for (Header header : headers) { 
      result = header.getValue(); 
     } 
     return result.substring(result.indexOf("''") + "''".length(), result.length()).trim(); 
    } 

Nhưng điều này tải xuống toàn bộ nội dung phản hồi. Tôi chỉ muốn lấy các tiêu đề http mà không có nội dung. Yêu cầu HEAD dường như không hoạt động vì sau đó tôi nhận trạng thái 501, không được triển khai. Làm thế nào tôi có thể làm điều đó?

+1

chỉ không đọc nội dung phản hồi? – irreputable

+0

@irreputable Tôi sẽ làm điều này nếu tôi biết làm thế nào;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity(). GetContent());' là những gì đọc thực thể; bạn có thể không làm điều đó? –

Trả lời

17

Thay vì thực hiện một yêu cầu GET, bạn có thể xem xét chỉ thực hiện một yêu cầu HEAD:

Phương pháp HEAD giống với GET ngoại trừ việc máy chủ PHẢI KHÔNG trở lại một thông điệp cơ thể trong phản ứng. Các metainformation chứa trong tiêu đề HTTP để đáp ứng với một yêu cầu HEAD NÊN được giống hệt nhau đến thông tin được gửi để đáp ứng yêu cầu GET. Phương pháp này có thể được sử dụng để thu thập thông tin về thực thể được ngụ ý bởi yêu cầu mà không cần chuyển chính thân thực thể đó. Phương pháp này là thường được sử dụng để kiểm tra các liên kết siêu văn bản cho tính hợp lệ, khả năng truy cập, và sửa đổi gần đây.

+0

Tôi đã thử điều này, nhưng tiêu đề trông khác ngay bây giờ :(Tôi đã kiểm tra lại và mã trạng thái là 501, không được triển khai nên máy chủ của tôi có vẻ không xử lý yêu cầu đó. Các khả năng khác? – RoflcoptrException

+0

@Roflcoptr - Đó là lame. Bạn * có thể * có thể sử dụng tiêu đề ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) để yêu cầu phạm vi 0-0 của thực thể, nhưng tôi chưa bao giờ sử dụng tiêu đề 'Phạm vi' hoặc phản hồi một phần, vì vậy tôi không thể nói chuyện đó. Có lẽ ai đó khác có thể kêu vang. Ngoài ra, có thể máy chủ sẽ –

+0

Hiện tại tôi đã tìm được cách giải quyết, tôi nhận được yêu cầu nhưng ngay sau khi tôi nhận được tiêu đề, tôi gọi là hủy bỏ Đây có phải là cách thực hành tốt không? – RoflcoptrException

5

Bạn có thể sử dụng số Range header trong yêu cầu để chỉ định một dải byte để bao gồm trong thực thể phản hồi. Có thể cái gì đó như:

Range: bytes=0-0 

Nếu nó không làm việc, bạn sẽ nhận lại một 206 Partial Content với các byte quy định tại Range tiêu đề của bạn hiện diện trong thực thể phản ứng. Tuy nhiên, tôi chưa thử điều này và cũng không được bảo đảm hoạt động:

Máy chủ CÓ THỂ bỏ qua tiêu đề Phạm vi.

+1

Điều kỳ lạ là máy chủ triển khai Phạm vi chứ không phải HEAD? Ngoài ra, Phạm vi 0-0 bao gồm 1 byte. – irreputable

+0

@irreputable - Vâng, đó cũng là suy nghĩ của tôi; có khả năng là máy chủ sẽ không có sẵn tính năng này vì không được thực hiện 'HEAD'. Đối với điều 1 byte, RFE2616 (phần 14.35.1) nói: * "Nếu giá trị byte-pos cuối cùng hiện diện, nó phải lớn hơn ** hoặc bằng ** giá trị byte đầu tiên trong đó byte-range-spec, hoặc byte-range-spec là cú pháp không hợp lệ. "* - với tôi, điều này nói rằng một dải 0-byte là hợp lệ. –

+1

0-0 là hợp lệ, nhưng nó có nghĩa là 1 byte, byte thứ 0.bạn không thể yêu cầu 0 byte; phản hồi 206 không thể trả về 0 byte. đó thực sự là một chút kỳ quặc. mặc dù trong thực tế, yêu cầu 0 byte sẽ không hữu ích; nhưng không thể làm như vậy là trái với bản năng lập trình viên. – irreputable

Các vấn đề liên quan