6

私は Refit for RestAPI を使用しています。同じクエリ文字列を作成する必要がありますapi/item?c[]=14&c[]=74

修理インターフェースでメソッドを作成しました

[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

この機能を無効にする方法

4

2 に答える 2

5

まず、あなたの API サーバーは以下を解析できましたか? api/item?c%5B%5D=14%26c%5B%5D%3D74

エンコーディングは、サーバーへのコード インジェクションを回避するのに最適です。

これは、Refitが少し意見を述べていることです。つまり、uris をエンコードする必要があります。エンコードされた uris を読み取るようにサーバーをアップグレードする必要があります。

しかし、これは明らかにRefitのオプトイン設定である必要がありますが、そうではありません。

したがって、現在、DelegatingHandler を使用してそれを行うことができます。

/// <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()))
于 2016-11-26T19:29:02.870 に答える