2016-11-16 110 views
2

我使用Refit for RestAPI。 我需要創建查詢字符串相同api/item?c[]=14&c[]=74如何在Refit中禁用urlencoding get-params?

在改裝界面我創建方法

[Get("/item")] 
Task<TendersResponse> GetTenders([AliasAs("c")]List<string> categories=null); 

,創造CustomParameterFormatter

string query = string.Join("&c[]=", values); 

CustomParameterFormatter生成的字符串14&c[]=74

但改裝編碼參數,生成的URL api/item?c%5B%5D=14%26c%5B%5D%3D74

如何禁用此功能?

回答

0

,首先是你的API服務器能夠解析可循? api/item?c%5B%5D=14%26c%5B%5D%3D74

編碼非常適合避免代碼注入到您的服務器。

這是改裝是有點固執己見,即uris應編碼,服務器應升級到閱讀編碼的uris。

但是,這顯然應該是一個選擇在設置改裝但它不是。

/// <summary> 
/// Makes sure the query string of an <see cref="System.Uri"/> 
/// </summary> 
public class UriQueryUnescapingHandler : DelegatingHandler 
{ 
    public UriQueryUnescapingHandler() 
     : base(new HttpClientHandler()) { } 
    public UriQueryUnescapingHandler(HttpMessageHandler innerHandler) 
     : base(innerHandler) 
    { } 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var uri = request.RequestUri; 
     //You could also simply unescape the whole uri.OriginalString 
     //but i don´t recommend that, i.e only fix what´s broken 
     var unescapedQuery = Uri.UnescapeDataString(uri.Query); 

     var userInfo = string.IsNullOrWhiteSpace(uri.UserInfo) ? "" : $"{uri.UserInfo}@"; 
     var scheme = string.IsNullOrWhiteSpace(uri.Scheme) ? "" : $"{uri.Scheme}://"; 

     request.RequestUri = new Uri($"{scheme}{userInfo}{uri.Authority}{uri.AbsolutePath}{unescapedQuery}{uri.Fragment}"); 
     return base.SendAsync(request, cancellationToken); 
    } 
} 


Refit.RestService.For<IYourService>(new HttpClient(new UriQueryUnescapingHandler())) 

所以,你可以現在可以通過使用DelegatingHandler做