gpt4 book ai didi

c# - Web Api 参数绑定(bind) : snake_case to camelCase

转载 作者:行者123 更新时间:2023-11-30 20:20:39 24 4
gpt4 key购买 nike

我正在为一个新的 web api 项目做一些工作,我的方法/参数遵循标准的 c# 命名格式;方法名是PascalCase,参数是camelCase。

不幸的是,我刚刚发现发布给客户的文档中所有参数都是 ruby​​/php 样式,参数名称为 snake_case 类型。

返回对象和POST对象很容易转换;我使用了 crallen's code 的版本替换默认的 Json 输入/输出,但是对于 GET 请求,似乎没有这么简单的答案。

我宁愿保持我的命名约定不变。有没有办法告诉 Binder 自动将所有请求的 my_parameter 更改为 myParameter?我是否必须构建一个完全不同的 Binder ?

例如,如果我将其作为方法签名:

[Route("~/api/Widgets")]
[ResponseType(typeof(Widget))]
public async Task<HttpResponseMessage> GetWidget(int widgetId, int groupId)
{
. . .

我希望能够在 URL 中使用它

https://myserver.com/api/Widgets?widget_id=12345&group_id=54321

我是否必须重新发明轮子才能让它发挥作用?我已经看到替换特定类型模型绑定(bind)器的示例,但在这个级别上没有看到。我最好只更改代码中的参数名称吗?

最佳答案

您可以通过使用自定义 ApiControllerActionSelector 重写 Request.RequestUri 然后调用基本选择器来实现此目的。

这里是:

首先,创建自定义选择器:

public class SnakeCaseActionSelector : ApiControllerActionSelector
{
public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
var newUri = CreateNewUri(
controllerContext.Request.RequestUri,
controllerContext.Request.GetQueryNameValuePairs());

controllerContext.Request.RequestUri = newUri;

return base.SelectAction(controllerContext);
}

private Uri CreateNewUri(Uri requestUri, IEnumerable<KeyValuePair<string, string>> queryPairs)
{
var currentQuery = requestUri.Query;
var newQuery = ConvertQueryToCamelCase(queryPairs);
return new Uri(requestUri.ToString().Replace(currentQuery, newQuery));
}

private static string ConvertQueryToCamelCase(IEnumerable<KeyValuePair<string, string>> queryPairs)
{
queryPairs = queryPairs
.Select(x => new KeyValuePair<string, string>(x.Key.ToCamelCase(), x.Value));

return "?" + queryPairs
.Select(x => String.Format("{0}={1}", x.Key, x.Value))
.Aggregate((x, y) => x + "&" + y);
}
}

接下来,创建一些扩展以转换为驼峰大小写和转换为大写单词:

public static class StringExtensions
{
public static string ToCamelCase(this string source)
{
var parts = source
.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);

return parts
.First().ToLower() +
String.Join("", parts.Skip(1).Select(ToCapital));
}

public static string ToCapital(this string source)
{
return String.Format("{0}{1}", char.ToUpper(source[0]), source.Substring(1).ToLower());
}
}

最后将 Action 选择器添加到 WebApiConfig:

config.Services.Replace(typeof(IHttpActionSelector), new SnakeCaseActionSelector());

关于c# - Web Api 参数绑定(bind) : snake_case to camelCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903448/

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