我使用 Refit 进行 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
但Refit编码参数和生成的urlapi/item?c%5B%5D=14%26c%5B%5D%3D74
如何禁用该功能?
首先,你的 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()))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)