2016-11-26 2 views
1

Ich habe ein Problem mit der Google HTTP-Clientbibliothek für Java (1.22.0). Dies ist mein CodeGoogle HTTP-Clientbibliothek für Java löst HttpResponseException aus: 301 wurde dauerhaft verschoben

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(); 

und httpRequest.execute() throws

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

Unterhalb von Wireshark

ein paar Mal
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 

und wiederholen wird folgen. Vielleicht ist das Problem mit der URL, weil location ist /ogl/2502758/pakowacz+-+mile+widziane+panie und nächste Anfrage Methode erhalten ist /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie. In anderer Software und Bibliothek funktioniert alles (Google Chrome Browser, Postbote - Addon zu Chrome, JSOUP - Java Library).

Hat jemand eine Idee, wie man das Problem löst?

Antwort

0

Dies ist nicht Ihre Bibliothek Schuld.

Um zu verstehen, warum dieses Problem auftritt, müssen wir zuerst die "Fehler" Nachricht mit Ihrem Problem verbunden sind, verstehen:

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

Also, was bedeutet das? Nun, der letzte Teil der Fehlermeldung, die Beschreibung sagt "301 Moved Permanently". Worauf es sich bezieht, ist ein HTTP Status Code. Ein HTTP-Statuscode gibt an, was das Ergebnis einer bestimmten Anfrage ist. In diesem Fall war der Statuscode 301, die gemäß RFC-Protokoll bedeutet:

Die angeforderte Ressource eine neue permanente URI und alle zukünftigen Verweise auf diese Ressource zugewiesen wurde einer der zurück URIs verwenden sollten.

So bedeutet dies, dass die URL, die Sie verwenden, nicht mehr gültig ist, und dass Sie die neue URL für Sie durch die Location Antwort-Header angegeben verwenden. Jetzt scheint die verwendete Bibliothek intelligent genug zu sein, um dies zu erkennen, und initialisiert eine neue Anfrage an die neue URL. Das ist großartig und alles, aber Ihre Bibliothek, die Sie verwenden, ist falsch die URL von Location Header entfliehen, und die für die neue Anforderung (/ogl/2502758/pakowacz+-+mile+widziane+panie in /ogl/2502758/pakowacz%20-%20mile%20widziane%20panie) zu verwenden, und der Server empfängt diese Anfrage erkennt, dass diese zu Pfade sind nicht die gleichen (obwohl sie sein sollten. Also sendet der Server eine weitere 301-Antwort, die dem Client (in diesem Fall die Bibliothek) mitteilt, die URL ohne Entkommen zu verwenden, obwohl sie dieselbe sein sollte.

Nun, warum macht Ihre Bibliothek das? Es stellt sich heraus, dass nach RFC-Spezifikation das Zeichen "+" für URIs reserviert ist.Das bedeutet, dass dieses Zeichen zusammen mit anderen Zeichen nur für URIs gedacht sind Daher ist es nicht üblich, das Zeichen "+" in URIs aufzunehmen, es sei denn, es wird verwendet. f oder ein ganz bestimmter Zweck, der so aussieht, ist nicht der Fall.

Also das alles bedeutet, dass Sie die Bibliothek für diesen Fehler nicht beschuldigen können, können Sie nur die Leute beschuldigen, die diese Website entwickelt haben.

Der Grund dafür, dass dies in Ihrem Browser und anderen Orten funktioniert, ist, dass diese Clients die angeforderte URL für Sie nicht zu umgehen scheinen, bevor Sie sie an den Server senden.

+0

Vielen Dank für großartige technische Informationen. In diesem Fall kann ich etwas tun? Ich verstehe, dass die Bibliothek, die ich verwende (Google http Client) funktioniert gut, aber Remote-Server nicht. Ich habe eine Idee, eine andere Bibliothek zu verwenden, wenn ich 30x erhalte. Was denkst du darüber? –

+0

Nach dem Stöbern im Quellcode dieser Bibliothek sieht es so aus, als gäbe es eine Instanzvariable 'followRedirects', die Sie mit der Instanzmethode' setFollowRedirects (boolean) 'der Klasse' HttpRequest' (die Sie in Ihrem Code haben) setzen können). Setzen Sie das vielleicht auf false und folgen Sie der Umleitung, indem Sie den 'Location'-Header der Antwort erhalten. –

+0

Ich habe das schon mal eingestellt (siehe meinen Hauptbeitrag) –

Verwandte Themen