簡體   English   中英

用於Java的Google HTTP Client Library會拋出HttpResponseException:301已永久移動

[英]Google HTTP Client Library for Java throws HttpResponseException: 301 Moved Permanently

我的Google HTTP Client Client for Java(1.22.0)存在問題。 這是我的代碼

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 browser,postman - addon to chrome,JSOUP - java library)。

有誰知道如何解決這個問題?

這不是你圖書館的錯。

要了解為什么會出現此問題,我們必須首先了解與您的問題相關的“錯誤”消息:

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

那么這是什么意思? 好吧,錯誤消息的最后一部分,描述說“301 Moved Permanently”。 這指的是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中包含'+'字符並不標准,除非它用於非常特定的目的,看起來並非如此。

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

這在瀏覽器和其他地方有效的原因是因為這些客戶端在將其發送到服務器之前似乎沒有為您提取所請求的URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM