2013-06-09 8 views
1

URLConnection을 열 때 콘텐츠 길이를 얻기 위해 다음 코드를 사용하지만 -1을 반환합니다.urlconnection이 content-length를 읽지 않습니다.

URL url = new URL(sUrl[0]); 
URLConnection connection = url.openConnection(); 
connection.connect(); 
int fileLength = connection.getContentLength(); 

I는 추정 서버는 콘텐츠 길이 헤더 등 자신은 PHP에 다음 사용하여 한 세트 (및 관련 오브젝트의 파기를 값 -1되었음을 나타) 설정되지 않았 음 :

header('Content-Length: '.strlen($output)); 

strlen($output)의 값을 인쇄 할 때 올바른 값을 얻을 수 있지만이 헤더는 Java에 적합하지 않습니다.

제안 사항이나 추가 코드가 필요합니까? 감사합니다.

+2

Apache의 HTTPClient와 같이보다 목적 지향적 인 HTTP 라이브러리를 사용해 보았습니까? – fge

+0

정말 좋은 라이브러리입니다. +1 – Pragmateek

+0

Wireshark와 같은 도구로 요청을 스니핑하려고 했으므로 헤더가 서버에 의해 전송되었는지 확인할 수 있습니까? – Pragmateek

답변

0

transfer-encodingchunked으로 설정하면 content-length은 무시해야합니다. 그것은 내 웹 호스트,이 하나 걸립니다 및 PHP에서 수동으로 설정 한 경우에도 헤더를 완전히 제거됩니다 나타납니다. Chrome의 고급 REST 앱으로 확인되었습니다.

0

콘텐츠 길이 헤더가 실제로 연결중인 서버에서 다시 전송되는 경우 코드가 작동합니다. 다음 코드에서와 같이 콘텐츠 길이를 반환 않는 간단한 웹 서비스를 쳐서 증명할 수

URL url = new URL("http://freegeoip.net/json/199.201.1.200"); 
URLConnection connection = url.openConnection(); 
int fileLength = connection.getContentLength();  
System.out.println(fileLength); 

이를 실행하면, 당신이 콘텐츠 길이를 인쇄 볼 수 있습니다.

+0

나는 당신이'connection.connect();를 놓친 것을 알아 차 렸습니다. 의도적인지 오타였습니까? –

+0

의도적. 문서에서 :'getContentLength와 같이 연결된 상태에 의존하는 작업은 필요한 경우 암시 적으로 연결을 수행합니다 .' – cmbaxter