gpt4 book ai didi

c# - 如何在 Refit 中禁用 urlencoding get-params?

转载 作者:行者123 更新时间:2023-11-30 16:00:09 33 4
gpt4 key购买 nike

我将 Refit 用于 RestAPI。我需要创建相同的查询字符串 api/item?c[]=14&c[]=74

在 retrofit 界面我创建了方法

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

并创建 CustomParameterFormatter

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

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

但是 Refit 编码参数和生成的 url api/item?c%5B%5D=14%26c%5B%5D%3D74

如何禁用此功能?

最佳答案

首先,您的 api 服务器是否能够解析以下内容?api/item?c%5B%5D=14%26c%5B%5D%3D74

编码非常适合避免向您的服务器注入(inject)代码。

这是 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()))

关于c# - 如何在 Refit 中禁用 urlencoding get-params?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40632827/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com