2016-11-26 95 views
1

我的Google HTTP Client Library for Java(1.22.0)出現問題。 這是我的代碼用於Java的Google HTTP客戶端庫拋出HttpResponseException:301永久移動

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()拋出

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

下面是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 

遵循並重復幾次。 也許問題是與url,因爲location/ogl/2502758/pakowacz+-+mile+widziane+panie和下一個請求方法得到是/ogl/2502758/pakowacz%20-%20mile%20widziane%20panie。 在其他軟件和庫中,一切正常(google chrome瀏覽器,postman - 插件到chrome,JSOUP - java庫)。

有沒有人有一個想法如何解決這個問題?

回答

0

這不是你的圖書館的錯。

要了解爲什麼發生此問題,首先要了解你的問題相關的「錯誤」消息:

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

那麼,這是什麼意思?那麼,錯誤消息的最後一部分,描述中會顯示「301永久移動」。這是指的是一個HTTP狀態代碼。 HTTP狀態代碼指示特定請求的結果。在這種情況下,狀態碼是301,根據RFC協議意味着:

被請求的資源已被分配一個新的永久性URI,並且任何將來對該資源的引用都應該使用返回的URI之一。

因此,這意味着您使用的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中包含'+'字符是不標準的,除非它被使用f或者一個非常具體的目的,看起來不是這樣。

所以,這一切都意味着你不能責怪圖書館的這個錯誤,你只能責怪開發這個網站的人。

這可以在您的瀏覽器和其他地方使用的原因是因爲這些客戶端在將它發送到服務器之前似乎沒有爲您轉義所請求的URL。

+0

非常感謝你提供了很好的技術信息。在這種情況下,我可以做些什麼嗎?我明白,我使用的圖書館(谷歌HTTP客戶端)工作正常,但遠程服務器沒有。如果我收到30x,我有一個想法可以使用另一個庫。你怎麼看待這件事? –

+0

在此庫的源代碼中查找後,它看起來好像有一個實例變量'followRedirects',它可以通過類'HttpRequest'的實例方法'setFollowRedirects(boolean)'設置(您在代碼中)。所以也許將它設置爲false,然後通過獲取響應的'Location'頭來跟蹤重定向。 –

+0

我之前設置了這個(請參閱我的主要帖子) –

相關問題