我正在使用Picasso组件将我的图像从url加载到ImageView
。问题是,我需要在header中传递一个身份验证令牌以及URL,以确保我可以访问它。
如何使用Picasso组件将Authentication令牌与URL一起传递?
刚刚完成了库的绑定:
- 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。如果由于某种原因不希望这样做(应该不会引起任何问题),那么您将不得不使用Cheesebaron提供的答案。
NuGet上的Picasso库和Xamarin组件库非常老。它已经一年多没更新了。因此,您在那里看到的代码可能与您现有的代码略有不同。
如果你需要为你的图像请求添加一个标题,你可以实现你自己的IDownloader
,你交给毕加索:
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
头设置得很好。
显然你可以设置任何你想要的标题