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

具有空参数的 $http.get 未命中 Web API 控制器

范承志
2023-03-14

我正在尝试使用$http访问Web API get控制器。按如下方式进行角度应用:

$http.get(BasePath + '/api/documentapi/GetDocuments/' , 
                                {
                                    params: {
                                        PrimaryID: ID1,
                                        AlternateID: ID2,                                            
                                    }
                                }).then( ...

在我的例子中,PrimaryID或AlternateID都具有该值。因此,其中一个将始终为空。

我的Web api方法是

public DocumentsDto[] GetDocuments(decimal? PrimaryID, decimal? AlternateID)
    { ...

当其中一个值为 null 时,$http.get 生成的 url 如下所示:

http://BaseServerPath/api/documentapi/GetDocuments/?PrimaryID=1688 

或者

 http://BaseServerPath/api/documentapi/GetDocuments/?AlternateID=154

这不符合我的Web API方法。

但是,如果我使用

http://BaseServerPath/api/documentapi/GetDocuments/?PrimaryID=1688&AlternateID=null

它工作了。我可以在我的参数中将值硬编码为null,但是我想知道是否有正确的方法来实现这一点。

谢谢山姆

共有3个答案

南宫嘉
2023-03-14

还有一个选项可以是将请求参数转换为复杂对象,并使用[FromUri]从Url创建对象。

董弘新
2023-03-14

尽管您已经在Web API控制器上指定这两个参数可以为空,但是ASP.NET路由引擎仍然会在对该方法的调用中寻找两个参数——即使其中一个为空。

理想情况下,您应该创建两个方法,一个只接受主方法,另一个只接受次方法,但是在您的情况下,这有点棘手,因为您的两个id属于同一类型。尽管您可以指定哪个参数对应于查询字符串中提供的值,但这两种方法在您的控制器类中将具有相同的签名(类型为< code>decimal的单个参数)。

所以你在这里有两个选择。要么创建新的控制器,以便有一个接收 PrimaryID 查询和一个 Secondary ID 查询的控制器,或者你有一个方法将一个包含一个 ID 设置为值和另一个设置为 null 的对象,并基于该方法运行查询。

佟和安
2023-03-14

我从@RobJ得到了正确的答案。他发布了答案的链接。我也在这里粘贴了相同的答案。解决方案是为Web API参数设置默认值。

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

就我而言,这将是

public DocumentsDto[] GetDocuments(decimal? PrimaryID = null, decimal? AlternateID = null)
{ ...
 类似资料:
  • Swagger不在UI和JSON中显示参数,即使我的方法有参数,当我添加[FromBody]标记 Swagger UI无参数JSON文件无参数 操作方法时,尤其会发生这种情况: 我使用全新的 Asp.net 核心3.1和2.2 Web应用程序与API模板来测试这一点,我完全按照文档配置 服务进行了配置: 配置:< br > 当我使用[FromRoute]等其他属性时,它确实起作用 我还尝试了这样的

  • 问题内容: 我想执行一个简单的本机查询,但是它不起作用: 为什么会出现此异常? 问题答案: JPA在本机查询中不支持命名参数,仅对于JPQL。您必须使用位置参数。 命名参数遵循第4.4.1节中定义的标识符规则。命名参数的使用适用于Java Persistence查询语言,而不是为本机查询定义的。 仅位置参数绑定可用于本机查询。 所以用这个 尽管JPA规范在本机查询中不支持命名参数,但某些JPA实现

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 我试图通过web api microsoft应用程序中的post请求传递对象的参数,但传递的参数始终为null。 这是我的控制器的post方法,在调试下程序达到了方法但是dataUrlIN。url字符串始终为空 这是DataUrl的对象 这是post请求的最新版本 在发送post请求后,方法公共无效Post(Data Url dataUrlIN)中的断点被触发,但url字符串为空HelloWorl

  • 问题内容: 我想执行一个简单的本机查询,但是不起作用: 为什么会出现此异常? 问题答案: JPA在本机查询中不支持命名参数,仅对于JPQL。您必须使用位置参数。 命名参数遵循第4.4.1节中定义的标识符规则。命名参数的使用适用于Java Persistence查询语言,而不是为本机查询定义的。 仅位置参数绑定可用于本机查询。 所以用这个 尽管JPA规范在本机查询中不支持命名参数,但某些JPA实现(

  • 在代码中我发现: 类雇员不是我们的类,可能从wsdl文件生成,其中参数(年龄和地点)被称为,,所以有人试图命名null参数以知道哪个是哪个,但这是好的做法吗?另一个问题是,和被翻译,而其他两个参数只是,但除此之外,创建带有值的变量只是为了将其传递到构造函数的下一行,可以吗?