API呼び出しを使用するためにApache HttpClientを使用しています。
ログインAPI呼び出しを使用してサインイントークンを取得し、他のすべてのAPI呼び出しでこのトークンをヘッダーパラメーターとして使用しています。このサインイントークンはしばらくすると期限切れになり、その後のAPI呼び出しは401承認されていないエラーを返します。Apache HttpCleintが401エラーを検出し、自動的にサインインして元のAPI呼び出しを再試行できるようにしたいのですが。
グーグルで私はまさに私の要件であるリンクを見つけました。401で自動的に再試行し、HttpClient 4.3で特定のリクエストを送信する
ここで提案されているようにOkHttpClientを使用することはできませんが、ここで提案されている他のソリューションは、「実行」メソッドの結果をキャプチャしたHttpClientを介してProxyクラスを書き込むことです。私はこれを行う方法についての考えを持っていません。
誰かがこれについて私を助けてくれますか?
インターフェースMyHttpClient
を実装するコードのようなクラスを持つことができHttpClient
ます。デコレータパターンを使用できます。つまり、実際のHttpClient
クラスの内部インスタンスがあり、そのメソッド呼び出しのほとんどすべてをそのクラスに委任します。
public class MyHttpClient implements HttpClient {
private HttpClient httpClient;
private String signinToken = ""
public MyHttpClient() {
this.httpClient = HttpClient5Factory.createHttpClient();
this.signinToken = SigninTokenProvider.getToken();
}
@Override
public HttpParams getParams() {
return this.httpClient.getParams();
}
@Override
public ClientConnectionManager getConnectionManager() {
return this.httpClient.getConnectionManager();
}
...
}
次に、このクラスでサインインヘッダーをフェッチするロジックを実装できます。または、他のクラスにある場合は、このクラスがそれらを呼び出して、必要に応じてサインイントークンを更新できます。このクラスにサインインヘッダーを追加すると、サインインを1か所で処理できるようになるため、はるかに意味があると思います。
execute
メソッドの実装では、次のようなコードが必要です。
@Override
public HttpResponse execute(HttpUriRequest request) throws IOException, ClientProtocolException {
// add signin header to each request
request.addHeader(new BasicHeader("Authorization", this.signinToken));
HttpResponse response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
// do the authentication process again
this.signinToken = SigninTokenProvider.getToken();
request.removeHeader("Authorization");
request.addHeader(new BasicHeader("Authorization", this.signinToken));
// resend the request
response = httpClient.execute(request);
}
return response;
}
ご覧のとおり、実際のAPIを呼び出して応答ステータスを確認できます。401の場合、認証プロセスをやり直して新しいサインイン値をフェッチし、新しいサインイン値を使用してリクエストを再試行できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加