2016-11-26 7 views
1

Java 용 Google HTTP Client Library (1.22.0)에 문제가 있습니다. 이) (내 코드Java 용 Google HTTP 클라이언트 라이브러리에서 HttpResponseException : 301 Moved Permanently

String url = "http://gazetapraca.pl/ogl/2502758"; 
GenericUrl genericUrl = new GenericUrl(url); 
ApacheHttpTransport apacheHttpTransport = new ApacheHttpTransport(); 
HttpRequest httpRequest = apacheHttpTransport.createRequestFactory().buildGetRequest(genericUrl); 
httpRequest.setFollowRedirects(true); 
HttpResponse httpResponse = httpRequest.execute(); 

및 httpRequest.execute입니다 몇 번 Wireshark를

GET /ogl/2502758 HTTP/1.1 
Accept-Encoding: gzip 
User-Agent: Google-HTTP-Java-Client/1.22.0 (gzip) 
Host: gazetapraca.pl 
Connection: Keep-Alive 

HTTP/1.1 301 Moved Permanently 
Date: Sat, 26 Nov 2016 22:15:52 GMT 
Server: Apache 
Location: /ogl/2502758/pakowacz+-+mile+widziane+panie 
Content-Length: 0 
Set-Cookie: JSESSIONID_JOBS=2f1TffY6JYcb6zvBSrQ72fds7rfdsSnHM3sefw6D31Lfr434bnkDmdLQJLvLFZ6zkYBF!-12116034235597; path=/; HttpOnly 
Content-Language: pl 
P3P: CP="NOI DSP COR NID PSAo OUR IND" 
Vary: User-Agent 
Keep-Alive: timeout=2, max=100 
Connection: Keep-Alive 

GET /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie HTTP/1.1 
Accept-Encoding: gzip 
User-Agent: Google-HTTP-Java-Client/1.22.0 (gzip) 
Host: gazetapraca.pl 
Connection: Keep-Alive 
Cookie: JSESSIONID_JOBS=2f1TffY6JYcb6zvBSrQ72fds7rfdsSnHM3sefw6D31Lfr434bnkDmdLQJLvLFZ6zkYBF!-12116034235597 

HTTP/1.1 301 Moved Permanently 
Date: Sat, 26 Nov 2016 22:15:52 GMT 
Server: Apache 
Location: /ogl/2502758/pakowacz+-+mile+widziane+panie 
Content-Length: 0 
Content-Language: pl 
P3P: CP="NOI DSP COR NID PSAo OUR IND" 
Vary: User-Agent 
Keep-Alive: timeout=2, max=99 
Connection: Keep-Alive 

에서 따라 반복되는 다음

 com.google.api.client.http.HttpResponseException: 301 Moved Permanently 

가 발생합니다. location/ogl/2502758/pakowacz+-+mile+widziane+panie이고 다음 요청 방법이 /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie이므로 URL에 문제가있는 것일 수 있습니다. 다른 소프트웨어 및 라이브러리에서는 모든 것이 작동합니다 (Google 크롬 브라우저, 우편 배달부 - 크롬 추가 기능, JSOUP - 자바 라이브러리).

누구든지 문제를 해결하는 방법을 알고 있습니까?

답변

0

이것은 도서관의 잘못이 아닙니다.

com.google.api.client.http.HttpResponseException: 301 Moved Permanently

그래서,이 무슨 뜻 :

이 문제가 발생하는 이유는, 우리가 처음 문제와 관련된 "오류"메시지를 이해해야 이해하기? 오류 메시지의 마지막 부분 인 설명에 "301 Moved Permanently"라고 표시됩니다. 그것이 말하는 것은 HTTP 상태 코드입니다. HTTP 상태 코드는 특정 요청의 결과가 무엇인지 나타냅니다.

요청한 리소스가 반환 된 URI 중 하나를 사용하는 것이 좋습니다 새로운 영구 URI 향후이 자원에 대한 참조를 부여하지 않은 :이 경우, 상태 코드는 RFC 프로토콜에 따라 즉, 301이었다.

따라서 사용중인 URL이 더 이상 유효하지 않으며 Location 응답 헤더로 지정한 새 URL을 사용해야 함을 의미합니다. 이제는 사용중인 라이브러리가이를 감지 할 정도로 똑똑하고 새 URL에 대한 새 요청을 초기화하는 것으로 보입니다. 이상 없습니다. 사용중인 라이브러리가 Location 헤더가 제공하는 URL을 잘못 빠져 나와 새 요청에 사용합니다 (/ogl/2502758/pakowacz+-+mile+widziane+panie/ogl/2502758/pakowacz%20-%20mile%20widziane%20panie으로 변경).이 요청을받은 서버는 경로에 대한 요청을 인식합니다. 따라서 서버는 다른 301 응답을 보내어 클라이언트 (이 경우 라이브러리)에 이스케이프 된 URL 대신 이스케이프 처리되지 않은 URL을 사용하도록 지시합니다.

라이브러리 스펙이 RFC 스펙에 따르면 URI의 경우 '+'문자가 예약되어 있기 때문에 그 문자는 다른 문자와 함께 URI에서만 사용된다는 것을 알 수 있습니다. 그러므로 그것들이 사용되지 않는다면 URI에 '+'문자를 포함하는 것이 표준이 아니다. 또는 그것이 보이는 특별한 목적은 그렇지 않습니다.

이 모든 것은이 오류에 대해 라이브러리를 비난 할 수 없다는 것을 의미합니다.이 사이트를 개발 한 사람들만을 비난 할 수 있습니다.

브라우저 및 다른 장소에서 작동하는 이유는 해당 클라이언트가 요청 된 URL을 이스케이프 처리하여 서버에 보내기 전에 보이지 않기 때문입니다.

+0

훌륭한 기술 정보를 보내 주셔서 감사합니다. 이 경우에는 무엇인가 할 수 있습니까? 내가 사용하는 라이브러리 (구글 HTTP 클라이언트) 잘 작동하지만 원격 서버를 이해하지 않습니다. 30x를 받으면 다른 라이브러리를 사용할 생각이 있습니다. 당신이 그것에 대해 어떻게 생각하십니까? –

+0

이 라이브러리의 소스 코드를 파고 들자면'HttpRequest' 클래스의 인스턴스 메소드'setFollowRedirects (boolean)'에 의해 설정할 수있는 인스턴스 변수'followRedirects'가있는 것처럼 보입니다). 그래서 그것을 false로 설정하고 응답의'Location' 헤더를 가져 와서 리디렉션을 따르십시오. –

+0

나는 이것을 전에 설정했다. (내 메인 포스트를 참조) –