Bibliothèque Android Picasso, Comment ajouter des en-têtes d'authentification?

J'ai essayé de configurer OkHttpClient personnalisé avec un authentificateur personnalisé, mais comme le dit le document: "Répond aux défis d'authentification du serveur Web ou proxy distant". Je dois faire 2 demandes pour chaque image, et ce n'est pas idéal.

Existe-t-il un intercepteur de requête comme Retrofit? Ou est-ce que je manque quelque chose dans OkHttpClient?

  • Galaxy s4 et peut-être tous les téléphones HD? Mise en évidence de l'erreur de mémoire insuffisante
  • R.Java non généré
  • Comment puis-je activer la nouvelle fonction Bluetooth A2DP Sink introduite dans Lollipop?
  • Dialogue temporaire modéré
  • Comment ajuster la taille de la police de texte pour qu'elle corresponde à la vision du texte
  • Emulator Android démarre mais Eclipse ne le reconnaît pas
  • J'utilise les dernières versions:

    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' 

    Merci!

  • Le bouton Retour Android ne retourne pas à l'activité précédente
  • Pourquoi ne puis-je jeter une exception lors de l'utilisation de l'opérateur ternaire
  • Comment utiliser les sélecteurs pour changer les icônes avec le nouveau TabLayout
  • Toolbar.inflateMenu semble ne rien faire
  • Alerte de sécurité sur libpng dans ma console google Play
  • Détecter le bouton de suppression dans le clavier doux
  • 5 Solutions collect form web for “Bibliothèque Android Picasso, Comment ajouter des en-têtes d'authentification?”

    Depuis que Picasso 2.5.0 OkHttpDownloader classe a été changé, en supposant que vous utilisez OkHttp3 (et donc picasso2-okhttp3-downloader ), vous devez donc faire quelque chose comme ceci:

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

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

    Voir la réponse de bryant1410 pour une solution plus à jour.


    Quelque chose comme cela fait le travail pour définir un en-tête de clé 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; } } } 

    Vous pouvez également ajouter l'authentification comme suggéré dans la documentation de OkHttp

    Ajoutez simplement ce client

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

    À Picasso comme ceci:

     final Picasso picasso = new Picasso.Builder(this) .downloader(new OkHttp3Downloader(client)) .build(); Picasso.setSingletonInstance(picasso); 

    La seule dépendance requise est:

     compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2' 

    Une manière simple comme celle-ci conservera les configurations de temporisation et de cache de OkHttpClient par défaut:

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

    Ça marche

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

    dépendance:

     compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.