当前位置: 首页 > 知识库问答 >
问题:

C# Web API 查询字符串:必需选项之一

卫君博
2023-03-14

我有一个看起来像这样的 Web API 方法:

[Route("datatable")]
public HttpResponseMessage getDataTable([FromUri] decimal a, [FromUri] int p, [FromUri] decimal i, [FromUri] decimal m = 0, [FromUri] decimal e = 0) { ... }

我试图实现的是,必须提供ime中的任何一个。都可以提供,三个中的两个可以提供,或者任何一个都可以提供,但没有提供是无效的。

目前,i是必需的。当i应该未定义时,我当前正在传入0,但这很混乱。如果我使所有三个参数都是可选的,那么不提供它们就被认为是有效的。

以下调用应被视为有效,并应路由到该方法:

http://myhost.local/api/datatable?a=10&p=5&e=1&i=2&m=3

http://myhost.local/api/datatable?a=10&i=1&p=5

http://myhost.local/api/datatable?a=10&i=0&p=5&m=1

http://myhost.local/api/datatable?a=10&p=5&e=1

http://myhost.local/api/datatable?a=10&m=50&p=4

http://myhost.local/api/datatable?e=6&m=2&a=50&p=0

但是

http://myhost.local/api/datatable?a=50&p=0

应无效且未路由到该方法。

我使用HTTP属性路由。我希望路由失败(API生成404“无路由匹配”消息),而不是尽可能处理我自己代码中未定义的所有三个参数。(例如,假设我稍后决定在没有提供值的情况下实现一个单独的方法——我希望路由仍然有效。)

这可以做到吗?

共有1个答案

毕和志
2023-03-14

恐怕在路由层没有那种条件可选参数的概念。

可选参数是可选的,它们的工作方式就像您注意到的那样(也在这里讨论过)。无法在路由级别提供条件逻辑。

我希望你把签名改成如下(可选I)..

[Route("datatable")]
public HttpResponseMessage getDataTable([FromUri] decimal a, [FromUri] int p, [FromUri] decimal i = 0, [FromUri] decimal m = 0, [FromUri] decimal e = 0)

..并在参数验证的方法中添加自定义逻辑。当您得到无效的参数组合时,BadRequest状态是通知调用方的好方法。

 类似资料:
  • 我需要传递一个字符串参数作为querystring参数,这应该是可选的。 在这里,我希望将位置作为可选参数。我试着用作为。但它对我不起作用。让我知道解决方案。

  • PHP超文本标记语言 我有一个动作定义如下的表单: 1]form action="index.php?option=com_advertisment 但是当我提交表单时,下拉的选定值不会显示在查询字符串中。 这意味着不会替换为,而是以查询字符串的形式出现,如下所示: http://mydemoserver.com/index.php?option=com_advertisment 如果有人知道解决

  • 我想它一定是在请求体。我如何发送‘更新’查询或我做错了?

  • 我想它一定在请求的身体里。我如何发送“更新”查询或我做错了?

  • 本文向大家介绍C++之BOOST字符串查找示例,包括了C++之BOOST字符串查找示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++中BOOST字符串查找的方法,分享给大家供大家参考。具体方法如下: BOOST  字符串查找示例 boost 判定函数的使用 boost替换示例 希望本文所述对大家的C++程序设计有所帮助。

  • 问题内容: 是否有任何JavaScript库可以根据查询字符串,样式生成字典? 可以像这样使用的东西: “查询字符串”是否在.NET领域之外称为其他名称?为什么不分解为键/值集合? 编辑:我已经编写了自己的函数,但是任何主要的库都可以这样做吗? 问题答案: 是否有任何JavaScript库可以根据查询字符串,样式生成字典? 可以像这样使用的东西: “查询字符串”是否在.NET领域之外称为其他名称?