java - 适用于 Java 的 Google HTTP 客户端库抛出 HttpResponseException : 301 Moved Permanently

标签 java redirect http-status-code-301 google-http-client

我在使用适用于 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 上,因为 location/ogl/2502758/pakowacz+-+mile+widziane+panie ,下一个请求方法 get 是 /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie。 在其他软件和库中,一切正常(google chrome 浏览器、postman - chrome 插件、JSOUP - java 库)。

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

最佳答案

这不是您图书馆的错。

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

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

那么,这是什么意思呢?好吧,错误消息的最后一部分,描述是“301 Moved Permanently”。它指的是 HTTP 状态代码。 HTTP 状态代码指示特定请求的结果是什么。在本例中,状态码为 301,根据 RFC 协议(protocol),其含义为:

The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs.

因此,这意味着您使用的 URL 不再有效,并且您必须使用 Location 响应 header 提供给您的新 URL。现在,您使用的库似乎足够聪明,可以检测到这一点,并初始化对新 URL 的新请求。这很好,但是您正在使用的库错误地转义了 Location header 提供的 url,并将其用于新请求(将 /ogl/2502758/pakowacz+-+mile+widziane+panie 转换为 /ogl/2502758/pakowacz%20-%20mile%20widziane%20 panie),并且接收此请求的服务器认识到这些路径不相同(即使它们应该相同。因此,服务器发送另一个 301 响应,告诉客户端(在本例中为库)使用未转义的 URL 而不是转义的 URL,即使它们应该相同。

现在,您的图书馆为什么要这样做?事实证明,根据 RFC 规范,“+”字符是为 URI 保留的。这意味着该字符以及其他字符仅在 URI 中用于其预期目的。因此,在 URI 中包含“+”字符不是标准的,除非它用于非常特定的目的,但看起来并非如此。

所以,这一切都意味着你不能因为这个错误而责怪图书馆,你只能责怪开发这个网站的人。

这在您的浏览器和其他地方起作用的原因是因为这些客户端在将请求的 URL 发送到服务器之前似乎没有为您转义。

关于java - 适用于 Java 的 Google HTTP 客户端库抛出 HttpResponseException : 301 Moved Permanently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823926/

相关文章:

bash - 将 sed 's/c/d/' myFile 的输出重定向到 myFile

asp.net - 在asp.net中更推荐的301重定向方式是什么?

asp.net-mvc - ASP.NET MVC - 301 重定向 - SEO 问题

apache - 将 http 转发到 https 在 iOS Safari 上不起作用

c# - Android与C#之间的进程间通信

php - 为什么这个 header 位置重定向在内容已经被回显后起作用?

html - 将用户重定向到移动网站的 SEO 问题

java - java中两个对象的区别

java - 部署到 websphere 时在 hibernate 5 上使用 JPA 2.0

带有自定义项的 Java Swing Jtree 或 Jlist