从显示的查询参数名称中删除嵌套复杂类型的 属性 名称,仅显示子基元 属性 名称
Remove nested complex-type's property name from displayed query parameter name, only show child primitive property names
我的控制器包含此代码:
[HttpGet]
public IActionResult GetNewQuestLocation([FromQuery]UserLocationPreferences userLocationPrefs)
{
//code here
}
这里是用作参数的模型:
public record UserLocationPreferences(Location UserLoc, UserSettingsDto UserSettings);
及其子参数:
public record Location(double Latitude, double Longitude);
public record UserSettingsDto(double MaxDistance, double MinDistance);
问题
我在创建 API 方面的经验很少,而且我遇到了 运行 一个问题,其中一个复杂类型在另一个复杂类型中显示该复杂类型的 属性 名称查询的参数名称。
例如,在 Swagger 上,上面的端点是这样的:
及其完整的 URL 如下所示:
https://exampleAPI.com/api/quest?UserLoc.Latitude=53.74&UserLoc.Longitude=-2.498&UserPrefs.MaxDistance=1.0&UserPrefs.MinDistance=0.5
我希望通过别名化参数的方式删除此端点中的 UserLoc
和 UserSettings
,这样它就不会包含复杂类型的 属性 名称,仅包含原始类型类型内:
UserLoc.Latitude
-> Latitude
UserSettings.MinDistance
-> MinDistance
等等
我认为这与模型绑定有关,但我是新手,我还没有找到解决此类情况的在线资源。
如果这是个坏主意,请告诉我原因。我这样做的原因是因为我发现查询有点长,如果后面的多个嵌套类型会显着扩展查询大小,那将是一个问题。我的想法是为这些参数设置别名以便于使用。
提前致谢!
这是使用模型 class 而不是记录的解决方法:
public class Location
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public class UserSettingsDto
{
public double MaxDistance { get; set; }
public double MinDistance { get; set; }
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult GetNewQuestLocation([FromQuery] Location UserLoc, [FromQuery] UserSettingsDto UserSettings)
{
return Ok();
}
}
结果:
My thought was to alias these parameters for ease of use.
如果一定要使用record,可以像下面这样修改参数名来减少查询字符串的长度:
public record UserLocationPreferences(Location l, UserSettingsDto u);
结果:
我的控制器包含此代码:
[HttpGet]
public IActionResult GetNewQuestLocation([FromQuery]UserLocationPreferences userLocationPrefs)
{
//code here
}
这里是用作参数的模型:
public record UserLocationPreferences(Location UserLoc, UserSettingsDto UserSettings);
及其子参数:
public record Location(double Latitude, double Longitude);
public record UserSettingsDto(double MaxDistance, double MinDistance);
问题
我在创建 API 方面的经验很少,而且我遇到了 运行 一个问题,其中一个复杂类型在另一个复杂类型中显示该复杂类型的 属性 名称查询的参数名称。
例如,在 Swagger 上,上面的端点是这样的:
及其完整的 URL 如下所示:
https://exampleAPI.com/api/quest?UserLoc.Latitude=53.74&UserLoc.Longitude=-2.498&UserPrefs.MaxDistance=1.0&UserPrefs.MinDistance=0.5
我希望通过别名化参数的方式删除此端点中的 UserLoc
和 UserSettings
,这样它就不会包含复杂类型的 属性 名称,仅包含原始类型类型内:
UserLoc.Latitude
-> Latitude
UserSettings.MinDistance
-> MinDistance
等等
我认为这与模型绑定有关,但我是新手,我还没有找到解决此类情况的在线资源。
如果这是个坏主意,请告诉我原因。我这样做的原因是因为我发现查询有点长,如果后面的多个嵌套类型会显着扩展查询大小,那将是一个问题。我的想法是为这些参数设置别名以便于使用。
提前致谢!
这是使用模型 class 而不是记录的解决方法:
public class Location
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
public class UserSettingsDto
{
public double MaxDistance { get; set; }
public double MinDistance { get; set; }
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult GetNewQuestLocation([FromQuery] Location UserLoc, [FromQuery] UserSettingsDto UserSettings)
{
return Ok();
}
}
结果:
My thought was to alias these parameters for ease of use.
如果一定要使用record,可以像下面这样修改参数名来减少查询字符串的长度:
public record UserLocationPreferences(Location l, UserSettingsDto u);
结果: