Библиотека Android Picasso, Как добавить заголовки аутентификации?
Я попытался настроить пользовательский OkHttpClient с помощью настраиваемого Аутентификатора, однако, поскольку в документе говорится: "Отвечает требованиям аутентификации с удаленного веб-сервера или прокси-сервера". Я должен сделать 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'
Спасибо!
Ответы
Ответ 1
Так как класс 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();
Источник: https://github.com/square/picasso/issues/900
Ответ 2
См. bryant1410 answer для более актуального решения.
Что-то вроде этого выполняет задание для установки заголовка 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;
}
}
}
Ответ 3
Вы также можете добавить аутентификацию, как предлагается в документации 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'
Ответ 4
Работает
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'
Ответ 5
Простым способом, таким образом, будет использоваться тайм-аут и настройки кэша по умолчанию 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();