繁体   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