squareup - Biblioteca de Android Picasso, ¿Cómo agregar encabezados de autenticación?
picasso android dependencia (5)
Esta funcionando
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);
dependencia:
compile ''com.squareup.picasso:picasso:2.5.2''
compile ''com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0''
He intentado configurar un OkHttpClient personalizado con un autenticador personalizado, sin embargo, como dice el documento: "Responde a los desafíos de autenticación desde la web remota o el servidor proxy". Tengo que hacer 2 solicitudes para cada imagen, y eso no es lo ideal.
¿Hay un interceptor de solicitud como lo hace Retrofit? O me estoy perdiendo algo en el OkHttpClient?
Estoy usando las últimas versiones:
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''
¡Gracias!
También puede agregar la autenticación como se sugiere en la documentación de OkHttp
Solo agrega este cliente
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();
A Picasso así:
final Picasso picasso = new Picasso.Builder(this)
.downloader(new OkHttp3Downloader(client))
.build();
Picasso.setSingletonInstance(picasso);
La única dependencia necesaria es:
compile ''com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2''
Una forma sencilla como esta mantendrá las configuraciones predeterminadas de tiempo de espera y caché de 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();
Ya que la clase OkHttpDownloader
Picasso 2.5.0 ha sido cambiada, asumiendo que estás utilizando OkHttp3 (y por picasso2-okhttp3-downloader tanto picasso2-okhttp3-downloader ), entonces debes hacer algo como esto:
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();
Vea la respuesta de bryant1410 para una solución más actualizada.
Algo como esto hace el trabajo de configurar un encabezado de clave 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;
}
}
}