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

Posted

技术标签:

【中文标题】强制 Http Get 接受带参数或不带参数的请求【英文标题】:Force Http Get to accept requests either with or without parameters 【发布时间】:2020-05-18 05:17:40 【问题描述】:

考虑控制器:

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 请求以接受两者?

【问题讨论】:

公共 HttpResponseMessage 获取(字符串职业 = null) @SirRufo:不起作用 提醒自己:不要在一天的第一杯咖啡之前评论/回答;o) 【参考方案1】:

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

或者如果你希望它有一个默认值以防没有给出值,那么使用[Route("api/employee/profession=value")]

查看更多来自documentation

【讨论】:

谢谢,不过我得到了: "Message": "No HTTP resource was found that matches the request URI 'https://localhost:44344/api/employee'.", "MessageDetail": "No action was found on the controller 'employee' that matches the request." 【参考方案2】:

如果您想同时允许这两个 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
        
    



【讨论】:

【参考方案3】:

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

【讨论】:

没有要求这样做,即使它是可能的。如果您使用“应该”,那么请根据应该这样做的方式提供信息。 嗨!感谢您指出了这一点!老实说,这是在 CS 学习期间教给我们的,我认为这是理所当然的,这就是我设计 API 的方式,但经过短暂查找后,我没有找到任何 REST 标准。对不起,误导性的答案,我会尽快编辑!

以上是关于强制 Http Get 接受带参数或不带参数的请求的主要内容,如果未能解决你的问题,请参考以下文章

Jsoup发送http请求,get和post两种方式,分别带参数和不带参数

如何定义带参数或不带参数调用的函数? [复制]

requests不带参数的get请求和带get参数请求

从零开发区块链应用--golang网络请求

怎么处理get传递的参数带有

ie8 get请求中文参数问题