2012-01-13 3 views
9

제 코드에서는 몇 가지 HTTP Get 요청을 사용하여 일부 파일을 스트림으로 다운로드합니다. 다음 코드를 사용합니다 :HTTP Get : 헤더 만 다운로드합니까? (HEAD는 지원되지 않습니다.)

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

그러나 응답의 전체 내용을 다운로드합니다. 콘텐츠가없는 HTTP 헤더 만 검색하려고합니다. HEAD 요청은 작동하지 않는 것 같습니다. 상태 501이 구현되지 않았기 때문입니다. 어떻게해야합니까?

+1

응답 본문을 읽지 않으십니까? – irreputable

+0

@irreputable 어떻게 알 수 있다면 이것을 할 것입니다;) –

+1

'InputStreamParser.convertStreamToString (response.getEntity() .getContent());'는 엔티티를 읽는 것입니다. 아마 그렇게 할 수는 없을까요? –

답변

17

대신 GET 요청을, 당신은 단지 HEAD 요청을 고려해 볼 수 있습니다 :

헤드 방법은 것을 제외하고 GET 동일 서버 MUST NOT 반환 응답에서 메시지 본문. 헤더 정보에 대한 응답으로 HTTP 헤더에 을 포함하는 메타 정보는 GET 요청에 대한 응답으로 전송 된 정보에 대해 과 동일해야합니다 (SHOULD). 이 방법은 요청에 의해 암시 된 엔터티에 대한 메타 정보를 얻기 위해 엔터티 본문 자체를 전송하지 않고 을 사용할 수 있습니다. 이 방법은 유효성, 접근성, 및 최근 수정에 대한 하이퍼 텍스트 링크를 테스트하는 데 자주 사용되는 입니다.

+0

시도했지만 헤더가 다르게 보입니다. (다시 확인했는데 상태 코드가 501이 아니기 때문에 구현되지 않았습니다.) 그래서 내 서버가 요청을 처리하지 않는 것 같습니다. 다른 가능성은 있습니까? – RoflcoptrException

+0

@Roflcoptr - 그건 절름발이입니다. ['Range'] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35) 헤더를 사용할 수 있습니다. 엔티티의 0-0 범위를 요청할 수 있습니다. 그러나 'Range'헤더 나 부분 응답을 사용한 적이 없으므로 실제로 말할 수는 없습니다. 다른 사람이 전화를 걸 수 있습니다. –

+0

현재 해결 방법을 찾았습니다. 요청을 받지만 헤더를 수신하자마자 중단을 호출합니다.이 좋은 실행입니까? – RoflcoptrException

5

요청에 Range header을 사용하여 응답 엔터티에 포함 할 바이트 범위를 지정할 수 있습니다. 아마 같은 :이 작업을 수행하는 경우

Range: bytes=0-0 

, 당신은 응답 엔터티에 존재하는 당신의 Range 헤더에 지정된 바이트와 206 Partial Content을 다시 받아야합니다. 그러나, 나는이 시도 적이 없다, 또한 작업을을 보장 아니다 :

서버는 Range 헤더를 무시할 수있다.

+1

서버가 Range를 구현하지만 HEAD를 구현하지 않는 것은 이상한 일입니까? 범위 0-0은 1 바이트를 포함합니다. – irreputable

+0

@irreputable - 네, 그건 제 생각입니다. 구현되지 않은'HEAD'가 주어지면 서버는 이것을 사용할 수 없을 것입니다. 1 바이트 일에 관해서는, RFE2616 (14.35.1 절)은 다음과 같이 말합니다 : "마지막 바이트 위치 값이 존재한다면, 그것은 ** 처음 바이트 위치의 **보다 ** 같거나 커야합니다 byte-range-spec이거나, byte-range-spec은 구문 적으로 유효하지 않습니다. "* - 나에게 0 바이트 범위가 유효하다고 말합니다. –

+1

0-0은 유효하지만 1 바이트, 즉 0 번째 바이트를 의미합니다.0 바이트를 요청할 수 없습니다. 206 응답은 0 바이트를 반환 할 수 없습니다. 그것은 정말로 조금 이상합니다. 실제로는 0 바이트를 요청하는 것이 유용하지는 않습니다. 그러나 이렇게 할 수 없다는 것은 프로그래머의 본능에 반하는 것이다. – irreputable