强制 Http Get 接受带参数或不带参数的请求

Force Http Get to accept requests either with or without parameters

考虑控制器:

public class EmployeeController : ApiController
{
    // https://localhost:44344/api/employee/:profession
    [HttpGet]
    [Route("api/employee/{profession}")]
    public HttpResponseMessage Get(String profession)
    {            

        try
        {
            var someBigList = ...
            /// ... do some stuff
            return Request.CreateResponse(HttpStatusCode.OK, someBigList );
        }
        catch (Exception e)
        {
            // error
        }
    }


}

控制器接受以下形式的请求:

https://localhost:44344/api/employee/:profession

但是当我尝试

https://localhost:44344/api/employee

没有。

我们如何修复 GET 请求以接受两者?

根据我的个人经验,如果它不是必需的参数,那么我会从查询中获取值,而不是从路由中获取。 所以可以使用[FromQuery] string profession,用法如下:https://localhost:44344/api/employee?profession=developer

您可以在路由中使用 ? 标记可选参数,因此这将是 [Route("api/employee/{profession?}")]

或者如果您希望它具有默认值以防未给出值,则使用 [Route("api/employee/{profession=value}")]

documentation

查看更多内容

如果您想要同时允许 URL,那么您将不得不再添加一条路线。这将简单地将您的请求路由到操作方法。 现在,由于您需要一个参数,因此应该将其作为查询字符串的一部分传递到请求参数中。

新路线应如下所示。

public class EmployeeController : ApiController
{
    // https://localhost:44344/api/employee/:profession
    [HttpGet]
    [Route("api/employee")]
    [Route("api/employee/{profession}")]
    public HttpResponseMessage Get(String profession)
    {            

        try
        {
            var someBigList = ...
            /// ... do some stuff
            return Request.CreateResponse(HttpStatusCode.OK, someBigList );
        }
        catch (Exception e)
        {
            // error
        }
    }


}