通过传递身份验证令牌 Picasso Xamarin 加载图像
Load Images by passing authentication token Picasso Xamarin
我正在使用 Picasso 组件将我的图像从 url 加载到 ImageView
。问题是我需要在 headers 中传递身份验证令牌以及 URL 以确保我可以访问它。
如何使用 Picasso 组件将身份验证令牌与 URL 一起传递?
NuGet 上的 Picasso 库和 Xamarin 组件商店非常旧。一年多没更新了。因此,您看到的代码可能与现有代码略有不同。
如果您需要将 header 添加到您的图像请求中,您可以实现自己的 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
header 设置得很好。
你显然可以设置任何你想要的header。
刚刚由 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。如果出于某种原因不需要这样做(应该不会引起任何问题),那么您将不得不使用 .
我正在使用 Picasso 组件将我的图像从 url 加载到 ImageView
。问题是我需要在 headers 中传递身份验证令牌以及 URL 以确保我可以访问它。
如何使用 Picasso 组件将身份验证令牌与 URL 一起传递?
NuGet 上的 Picasso 库和 Xamarin 组件商店非常旧。一年多没更新了。因此,您看到的代码可能与现有代码略有不同。
如果您需要将 header 添加到您的图像请求中,您可以实现自己的 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
header 设置得很好。
你显然可以设置任何你想要的header。
刚刚由 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。如果出于某种原因不需要这样做(应该不会引起任何问题),那么您将不得不使用