Web API 可选参数

Posted

技术标签:

【中文标题】Web API 可选参数【英文标题】:Web API optional parameters 【发布时间】:2016-11-09 23:33:25 【问题描述】:

我有一个带有以下签名的控制器:

[Route("products/filter/apc=apc/xpc=xpc/sku=sku")]
public IHttpActionResult Get(string apc, string xpc, int? sku)
 ... 

我使用以下 URI 调用此方法:

~/api/products/filter?apc=AA&xpc=BB ~/api/products/filter?sku=7199123

第一个 URI 没有问题。第二个有一个奇怪的副作用。即使 apc 和 xpc 的默认值在未提供时应该为 null,但参数实际上是它们的名称。我可以通过添加额外的逻辑来克服这个问题:

apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;

这似乎是一个 hack,如果传递的值永远等于参数名称,则会出现问题。

有没有办法在没有这种副作用的情况下定义路线?

【问题讨论】:

您在路由模板中提供了默认值。为什么你会认为他们是null 我以为 sku=sku 将查询字符串中的参数映射到方法参数。 您应该查看documentation for attribute routing。它展示了如何使参数可选。 【参考方案1】:
[Route("~/api/[Controller]/AutocompleteAdress/input=/input2=")]
public IEnumerable<string> GetAutocompleteAdress(string input, string input2)

它适用于我(ASP.NET WEB API)。

【讨论】:

【参考方案2】:

Sku 是一个 int,不能默认为字符串“sku”。请查看Optional URI Parameters and Default Values。

【讨论】:

不推荐的解决方案,因为如果不是null,您需要提供额外的验证逻辑来​​检查参数是否实际上是int。如果您坚持使用int?,框架会提供开箱即用的验证,您只需检查ModelState...【参考方案3】:

你只需要给参数设置默认值(你不需要Route属性):

public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
 ... 

【讨论】:

【参考方案4】:

我想通了。我使用了一个我在过去发现的如何将查询字符串映射到方法参数的坏例子。

如果其他人需要它,以便在查询字符串中包含可选参数,例如:

~/api/products/filter?apc=AA&xpc=BB ~/api/products/filter?sku=7199123

你会使用:

[Route("products/filter/apc?/xpc?/sku?")]
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
 ... 

当这些类型已经有默认值时,必须为方法参数定义默认值似乎很奇怪。

【讨论】:

我回应你的想法 - It seems odd to have to define default values for the method parameters when these types already have a default.。查看了 MSDN als here 上的详细信息,但它没有谈论任何技术细节,说明为什么决定这样做。 可空性和可选性是两个不同的概念,它们彼此无关(因为可空值可以在参数列表之外使用)。简单地声明一个参数int? 将其标记为可空,但它不是可选:您必须传递非空整数值或null。但是,添加= null 是声明可选参数的默认值所需的语法。因此,int? sku = null 是可空的 int,其默认值为 null(而不是其他一些整数值)。

以上是关于Web API 可选参数的主要内容,如果未能解决你的问题,请参考以下文章

带有可选参数的web api路由

ASP.NET Web API 中的可选查询字符串参数

ASP.NET Web API 中带有可选参数的属性路由

compojure-api 的可选查询参数(具有默认值)

您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?

将可选参数传递给 ASP.NET API 的 GET 方法