カスタムオーセンティケーターを使用してカスタムOkHttpClientを設定しようとしましたが、ドキュメントには次のように記載されています。「リモートWebサーバーまたはプロキシサーバーからの認証チャレンジに応答します。」画像ごとに2つのリクエストを行う必要がありますが、これは理想的ではありません。
Retrofitのような要求インターセプターはありますか?または、OkHttpClientに何か不足していますか?
私は最新バージョンを使用しています:
compile 'com.squareup.picasso:picasso:2.3.2'
compile 'com.squareup.okhttp:okhttp:2.0.+'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+'
compile 'com.squareup.okio:okio:1.0.0'
ありがとう!
Picasso 2.5.0 OkHttpDownloader
クラスが変更されたため、OkHttp3を使用していると想定しているため( picasso2-okhttp3-downloader )、次のようにする必要があります。
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder()
.addHeader("X-TOKEN", "VAL")
.build();
return chain.proceed(newRequest);
}
})
.build();
Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttp3Downloader(client))
.build();
最新の解決策については、 bryant1410の回答 を参照してください。
このような何かが、APIキーヘッダーを設定するジョブを実行します。
public class CustomPicasso {
private static Picasso sPicasso;
private CustomPicasso() {
}
public static Picasso getImageLoader(final Context context) {
if (sPicasso == null) {
Picasso.Builder builder = new Picasso.Builder(context);
builder.downloader(new CustomOkHttpDownloader());
sPicasso = builder.build();
}
return sPicasso;
}
private static class CustomOkHttpDownloader extends OkHttpDownloader {
@Override
protected HttpURLConnection openConnection(final Uri uri) throws IOException {
HttpURLConnection connection = super.openConnection(uri);
connection.setRequestProperty(Constants.HEADER_X_API_KEY, "MY_API_KEY");
return connection;
}
}
}
OkHttpのドキュメント で提案されているように認証を追加することもできます
このクライアントを追加するだけです
final OkHttpClient client = new OkHttpClient.Builder()
.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
String credential = okhttp3.Credentials.basic("user", "pw");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
}
})
.build();
このようにピカソに:
final Picasso picasso = new Picasso.Builder(this)
.downloader(new OkHttp3Downloader(client))
.build();
Picasso.setSingletonInstance(picasso);
必要な唯一の依存関係は次のとおりです。
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'
動いている
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.authenticator(new Authenticator()
{
@Override
public Request authenticate(Route route, Response response) throws IOException
{
String credential = Credentials.basic("username","password");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
}
}).build();
Picasso picasso = new Picasso.Builder(OnDemandImageCaptureActivity.this)
.downloader(new OkHttp3Downloader(okHttpClient))
.build();
picasso.load("http://example.com/abc.jpeg").into(ivcamera);
依存:
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
このような簡単な方法は、デフォルトのOkHttpClientタイムアウトとキャッシュ設定を保持します:
private class MyOkHttpDownloader extends OkHttpDownloader {
public MyOkHttpDownloader(final Context context) {
super(context);
getClient().interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder()
.addHeader("X-TOKEN", "VAL")
.build();
return chain.proceed(newRequest);
}
});
}
}
Picasso picasso = new Picasso.Builder(context).downloader(new MyOkHttpDownloader(context)).build();