studio squareup sirve que para libreria library dev dependencia adding android picasso okhttp

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();

Fuente: https://github.com/square/picasso/issues/900


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; } } }