1

Google HTTP Client Library 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、次のリクエスト メソッド get が であるためです/ogl/2502758/pakowacz%20-%20mile%20widziane%20panie。他のソフトウェアとライブラリでは、すべてが機能しています (Google Chrome ブラウザ、postman - Chrome へのアドオン、JSOUP - Java ライブラリ)。

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

4

1 に答える 1

0

これはライブラリのせいではありません。

この問題が発生する理由を理解するには、まず、問題に関連する「エラー」メッセージを理解する必要があります。

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

それで、これはどういう意味ですか?さて、エラーメッセージの最後の部分、説明には「301 Moved Permanently」とあります。それが参照しているのは、HTTP ステータス コードです。HTTP ステータス コードは、特定のリクエストの結果が何であるかを示します。この場合、ステータス コードは 301 でした。RFC プロトコルによれば、これは次のことを意味します。

要求されたリソースには新しい永続的な URI が割り当てられており、このリソースへの今後の参照では、返された URI のいずれかを使用する必要があります。

したがって、これは、使用している URL が無効になり、Location応答ヘッダーによって提供された新しい URL を使用する必要があることを意味します。現在、使用しているライブラリはこれを検出するのに十分スマートであり、新しい URL への新しい要求を初期化しているようです。それは素晴らしいことですが、使用しているライブラリは、ヘッダーによって提供された URL を誤ってエスケープし、それを新しい要求に使用してLocation(に変わる)、この要求を受信したサーバーはパスへのパスが同じではないことを認識しますしたがって、サーバーは別の 301 応答を送信し、クライアント (この場合はライブラリ) に、エスケープされた URL の代わりにエスケープされていない URL を使用するように指示します。/ogl/2502758/pakowacz+-+mile+widziane+panie/ogl/2502758/pakowacz%20-%20mile%20widziane%20panie

では、なぜあなたの図書館はこれを行っているのでしょうか? RFC 仕様によると、「+」文字は URI 用に予約されていることが判明しました。つまり、その文字は、他の文字と同様に、URI で意図された目的でのみ使用されることを意図しています。したがって、URI に「+」文字を含めることは標準ではありません。

したがって、これはすべて、このエラーをライブラリのせいにすることはできず、このサイトを開発した人々のせいにすることしかできないことを意味します。

これがブラウザやその他の場所で機能する理由は、これらのクライアントが要求された URL をサーバーに送信する前にエスケープしていないように見えるためです。

于 2016-11-26T23:32:02.870 に答える