1

我对适用于 Java 的 Google HTTP 客户端库 (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 上,因为locationis/ogl/2502758/pakowacz+-+mile+widziane+panie和下一个请求方法 get is /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie。在其他软件和库中,一切正常(谷歌 chrome 浏览器、邮递员 - chrome 插件、JSOUP - java 库)。

有谁知道如何解决这个问题?

4

1 回答 1

0

这不是你图书馆的错。

要了解为什么会出现此问题,我们必须首先了解与您的问题相关的“错误”消息:

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 发送到服务器之前似乎没有为您转义请求的 URL。

于 2016-11-26T23:32:02.870 回答