代码之家  ›  专栏  ›  技术社区  ›  codebased

在Refit代理和DelegatingHandler之间传递值

  •  0
  • codebased  · 技术社区  · 5 年前

    我正在使用Refit来定义我的HttpProxy方法。我还得到了一个自定义的委托,用于处理在发送请求之前插入的承载令牌请求。

    为了生成令牌,我需要一个ID。我使用头发送这个ID:

    Task<Response> UserInfo (string id, [Header("identity")] string identity);

    第一个Id是一个查询字符串,标识header是相同的值。因此,在通话中,它看起来非常难看:

    UserInfo("234","234");

    (不,我不想读取查询字符串,因为处理程序是通用的)

    我的处理程序如下所示,首先从标题中读取内容,然后从标题中删除内容:

    if (request.Headers.TryGetValues("identity", out IEnumerable<string> values))
                {
                    var immutableIdentity = values.ToImmutableArray();
                    if (!immutableIdentity.IsNullOrEmpty())
                    {
                        var identity = immutableIdentity.First();
                        request.Headers.Remove("identity");
                        return GenerateToken(identity);
                    }
                }
    

    与其使用头在Refit代理和HttpDelegete之间进行通信,我还有什么可能的选项?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Mustafa Sadedil    4 年前

    我想你可以用 Property 属性而不是 Header 属性本节摘自 Refit Documentation :

    如果需要将运行时状态传递给DelegatingHandler,则可以向底层HttpRequestMessage添加具有动态值的属性。通过将属性属性应用于参数来设置属性:

    public interface IGitHubApi
    {
        [Post("/users/new")]
        Task CreateUser([Body] User user, [Property("SomeKey")] string someValue);
    
        [Post("/users/new")]
        Task CreateUser([Body] User user, [Property] string someOtherKey);
    }
    

    然后你可以像这样访问这些变量:

    class RequestPropertyHandler : DelegatingHandler
    {
        public RequestPropertyHandler(HttpMessageHandler innerHandler = null) : base(innerHandler ?? new HttpClientHandler()) {}
    
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // See if the request has a the property
            if(request.Properties.ContainsKey("SomeKey"))
            {
                var someProperty = request.Properties["SomeKey"];
                //do stuff
            }
    
            if(request.Properties.ContainsKey("someOtherKey"))
            {
                var someOtherProperty = request.Properties["someOtherKey"];
                //do stuff
            }
    
            return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
        }
    }
    

    此外,你还需要考虑这个额外的警告:

    注:在。NET 5 HttpRequestMessage。属性已被标记为过时,Refit将把该值填充到新的HttpRequestMessage中。选项。

    推荐文章