通过身份验证令牌Picasso Xamarin加载图像

时间:2016-09-30 10:52:28

标签: android authentication xamarin access-token picasso

我正在使用Picasso组件将我的图片从网址加载到ImageView。问题是我需要在标题中传递身份验证令牌以及URL,以确保我可以访问它。

如何使用Picasso组件将身份验证令牌与URL一起传递?

2 个答案:

答案 0 :(得分:5)

Jake完成了对图书馆的绑定:
  - Java:https://github.com/JakeWharton/picasso2-okhttp3-downloader
  - C#:https://github.com/mattleibow/square-bindings

NuGet是JakeWharton.Picasso2OkHttp3Downloader(包裹在世界各地传播可能有延迟):

> Install-Package JakeWharton.Picasso2OkHttp3Downloader 

这可以从C#中以相同的方式使用:

using Square.OkHttp3;
using Square.Picasso;
using JakeWharton.Picasso;

// create the client
var client = new OkHttpClient.Builder()
    .AddInterceptor(chain =>
    {
        var newRequest = chain.Request()
            .NewBuilder()
            .AddHeader("X-TOKEN", "VAL")
            .Build();
        return chain.Proceed(newRequest);
    })
    .Build();

// create the picasso handle
var picasso = new Picasso.Builder(context)
    .Downloader(new OkHttp3Downloader(client))
    .Build();

// use picasso!
picasso
    .Load(url)
    .Placeholder(Resource.Drawable.placeholder)
    .Error(Resource.Drawable.error)
    .CenterInside()
    .Into(holder.image);

注意:此库使用OkHttp v3。如果由于某种原因不希望这样做(不应该导致任何问题),那么你将不得不使用answer provided by Cheesebaron

答案 1 :(得分:3)

NuGet上的Picasso图书馆和Xamarin Component商店非常古老。它在一年多的时间里没有更新。因此,可能与您从可用内容中看到的代码略有不同。

如果您需要为图片请求添加标题,则可以实现自己的IDownloader,并将其交给Picasso:

public class CustomDownloader : OkHttpDownloader
{
    public CustomDownloader(IntPtr handle, JniHandleOwnership transfer) 
        : base(handle, transfer)
    { }

    public CustomDownloader(string authtoken, Context context) : base(context)
    {
        Client.Interceptors().Add(new MyInterceptor(authtoken));
    }

    public class MyInterceptor : Java.Lang.Object, IInterceptor
    {
        private string _authtoken;

        public MyInterceptor(string authtoken)
        {
            _authtoken = authtoken;
        }

        public Response Intercept(IInterceptorChain chain)
        {
            var newRequest = chain.Request().NewBuilder().AddHeader("Authentication", _authtoken).Build();
            return chain.Proceed(newRequest);
        }
    }
}

然后,您可以添加以下自定义下载器:

var token = "authtoken";
var builder = new Picasso.Builder(this).Downloader(new CustomDownloader(token, this)).Build();

然后像往常一样,您可以像往常一样将图片下载到ImageView

builder.Load(Android.Net.Uri.Parse("https://test.com/img.jpg")).Into(imageView);

我已经针对Requestb.in对此进行了测试,Authentication标头设置得很好。

您显然可以设置任何标题。