我与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
,而下一个请求方法获取为/ogl/2502758/pakowacz%20-%20mile%20widziane%20panie
。在其他软件和库中,一切都在起作用(Google Chrome浏览器,Postman -addon to Chrome,jsoup -java库)。
有人知道如何解决问题吗?
这不是您库的错。
要了解为什么会出现此问题,我们必须首先了解与您的问题关联的"错误"消息:
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
),并且接收此请求的服务器确认这些对路径的识别是不一样(即使应该是。
现在,为什么您的图书馆这样做?事实证明,根据RFC规格," "字符是为uris保留的。这意味着该角色以及其他角色仅用于为其预期目的用于URI。因此,在URI中包括" "字符不是标准的,除非它用于非常具体的目的,但看起来并非如此。
所以,这一切都意味着您不能怪图书馆这个错误,您只能责怪开发此网站的人。
在您的浏览器和其他地方工作的原因是因为这些客户在将其发送到服务器之前似乎并没有为您逃脱所需的URL。