代码之家  ›  专栏  ›  技术社区  ›  David Carek

为什么我的查询字符串参数被url解码两次?[副本]

  •  2
  • David Carek  · 技术社区  · 7 年前

    http://localhost:52684/api/v1/some-resource?client_timezone=%2B0500 参数client timezone作为 " 0500" 而不是 "+0500" . 我唯一能想到的就是这个网址被解码了两次 "%2B" 变成 "+" 然后 " "

    控制器上有一个类似的端点

    [HttpGet]
    [Authorize]
    [ApiRoute("some-resource", StartingVersion = 1)]
    [EnableCors("*", "*", "GET", "*")]
    public IHttpActionResult SomeResource([FromUri] string timezone)
    {
        if (!DataValidationUtililties.IsValidClientTimezone(timezone))
        {
            return BadRequest();
        }
        return Ok();
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   David Carek    7 年前

    我想我找到了原因。我创造了一个 SnakeCaseActionSelector 它实际上重写了所有请求uri。在这样做时,它将对url进行解码,并且不再对查询字符串参数进行编码。

    public class SnakeCaseActionSelector : ApiControllerActionSelector
    {
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            var requestUri = controllerContext.Request.RequestUri;
            var queryPairs = controllerContext.Request.GetQueryNameValuePairs().ToList();
            if (!queryPairs.Any())
            {
                return base.SelectAction(controllerContext);
            }
            queryPairs = queryPairs.Select(x =>
                    new KeyValuePair<string, string>(CamelCaseToSnakeCaseConverter.FromSnakeCase(x.Key), x.Value))
                .ToList();
            var newQueryParams = queryPairs.Select(x => $"{x.Key}={x.Value}").Aggregate((x, y) => x + "&" + y);
            var builder = new UriBuilder(requestUri)
            {
                Query = newQueryParams
            };
            controllerContext.Request.RequestUri = builder.Uri;
    
            return base.SelectAction(controllerContext);
        }
    }
    
    推荐文章