2016-11-26 21 views
1

Google HTTP Client Client for Java(1.22.0)に問題があります。 これは私のコードJavaのGoogle HTTPクライアントライブラリがHttpResponseExceptionをスローする:301 Moved Permanently

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 

から続き、数回繰り返しています。 location/ogl/2502758/pakowacz+-+mile+widziane+panieであり、次のリクエストメソッドが/ogl/2502758/pakowacz%20-%20mile%20widziane%20panieであるため、問題がURLである可能性があります。 他のソフトウェアとライブラリではすべて動作しています(Google Chromeのブラウザ、Postman - Chromeのアドオン、JSOUP - javaライブラリ)。

誰も問題を解決する方法を知っていますか?

答えて

0

これはあなたのライブラリの欠陥ではありません。

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

ので、これはどういう意味:

は、この問題が発生している理由は、我々が最初にあなたの問題に関連した「エラー」のメッセージを理解する必要があります理解するには?さて、エラーメッセージの最後の部分には、「301 Moved Permanently」と記載されています。それが参照しているのは、HTTPステータスコードです。 HTTPステータスコードは、特定の要求の結果が何であるかを示します。この場合、ステータスコードは301であり、これはRFCプロトコルの意味である。

要求されたリソースには新しい永続URIが割り当てられ、今後このリソースへの参照は返されたURIの1つを使用するべきである(SHOULD)。

これは、使用している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に '+'文字を含めることは標準的ではありませんまたは非常に特定の目的は、それはそうではないように見えます。

これは、あなたがこのエラーのためにライブラリを責めることができないことを意味します。このサイトを開発した人だけを責めることができます。

ブラウザやその他の場所でこの機能が動作するのは、要求されたURLをエスケープしてサーバーに送信していないように見えるからです。

+0

すばらしい技術情報をありがとうございました。この場合は何かできますか?私はライブラリ(Google HTTPクライアント)はうまく動作するが、リモートサーバーは使用していないことを理解しています。私は30xを受け取ったら別のライブラリを使う考えがあります。あなたはそれについてどう思いますか? –

+0

このライブラリのソースコードを掘り下げた後、 'HttpRequest'クラスのインスタンスメソッド' setFollowRedirects(boolean) '(これはあなたのコードにあります)によってインスタンス変数' followRedirects'が設定できるようです)。だから、それをfalseに設定し、応答の 'Location'ヘッダを取得することでリダイレクトに従います。 –

+0

私はこれを前に設定しました(私のメインポストを参照してください) –

関連する問題