3

공유지 코드 IO 괜찮 :URL에 대한 403 IO 평민하지만 HttpClient를가

String resultURL = String.format(GOOGLE_RECOGNIZER_URL, URLEncoder.encode("hello", "UTF-8"), "en-US"); 
URI uri = new URI(resultURL); 
byte[] resultIO = IOUtils.toByteArray(uri); 

나는이 예외 가지고 :

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: http://translate.google.cn/translate_tts?ie=UTF-8&q=hello&tl=en-US&total=1&idx=0&textlen=3 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436) 
    at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:654) 
    at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:635) 
    at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:617) 
    at com.renren.intl.soundsns.simsimi.speech.ttsclient.impl.GoogleTTSClient.main(GoogleTTSClient.java:70) 

을하지만 난 HttpClient를 사용할 때, 그 결과는 괜찮습니다.

String resultURL = String.format(GOOGLE_RECOGNIZER_URL, URLEncoder.encode(text, "UTF-8"), "en-US"); 

HttpClient client = new HttpClient(); 

GetMethod g = new GetMethod(resultURL); 

client.executeMethod(g); 

byte[] resultByte = g.getResponseBody(); 

어떻게 되었습니까?

사전에 감사합니다 :)

받는다는 종속성 :

<dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
</dependency> 
<dependency> 
     <groupId>commons-httpclient</groupId> 
     <artifactId>commons-httpclient</artifactId> 
     <version>3.1</version> 
</dependency> 
+3

WireShark 또는 유사하게 요청의 차이를 살펴 보셨습니까? HttpClient가 다른 User-Agent 또는 그와 비슷한 것을 설정하는 것으로 의심됩니다. –

답변

4

존 소총이 옳다! 변경할 경우 자바를 들어, 사용자 에이전트를

User-Agent: Jakarta Commons-HttpClient/3.1 
Host: translate.google.cn 

을 그리고 아파치 HttpClient를의 경우

User-Agent: Java/1.7.0_10 
Host: translate.google.cn 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 

: java.net.URL의 JVM의 경우에 나를 위해

다음 헤더를 전달합니다. net.URL :

System.setProperty("http.agent", "Jakarta Commons-HttpClient/3.1"); 

요청은 HTTP하지 않고, 성공 (403)

사용자 에이전트가 Java으로 시작하면 403 오류가 발생합니다. 패턴이 Java.* 인 모든 사용자 에이전트는 403 오류를 발생시킵니다. 그러나이 패턴을 사용하면 .+Java.* 모두 괜찮습니다.

+0

덕분에 많은 작품을 :) – Felix

+0

만약 내가 하나가 더 나은 파일을 다운하려면? @Taky – Felix

+0

@Felix http (예 : byte [] MyApplicationHttClient # getBinaData (String url);)를 사용하여 작업하기에 편리한 응용 프로그램 인터페이스를 사용하여 추상화 계층을 작성합니다. 그리고 처음에는 java.net.URL을 사용하기 시작합니다. 그것이 나를 위해 충분하지 않은 경우 구현을 HttpClient로 한 곳에서만 변경합니다. – Taky