【问题标题】:Http get and post method without attribute name没有属性名的 Http get 和 post 方法
【发布时间】:2019-04-08 12:55:02
【问题描述】:

我正在使用 .net Core 2.1 Web API。我添加了每个方法[HttpGet("....")][HttpPost("....")],如下所示。但是,我不想在每个控制器中编写每个方法。我只想写[HttpGet][HttpPost]。我怎样才能做到这一点?

或者,如果这不可能,我可以像 [HttpPost("[action]")] 那样自动采取 actionName 吗?

我这样打电话: http://localhost:5000/api/University/GetUniversities

完美运行

namespace University.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UniversityController : ControllerBase
    {
        private readonly IUniversityService universityService;

        public UniversityController(IUniversityService universityService)
        {
            this.universityService = universityService;
        }

        [HttpGet("GetUniversities")]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

        [HttpGet("GetUniversityStatues")]
        public async Task<ServiceResult> GetUniversityStatues()
        {
            return await universityService.GetUniversityStatues();
        }
    }
}

我试过了,但没有用:

namespace University.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UniversityController : ControllerBase
    {
        private readonly IUniversityService universityService;

        public UniversityController(IUniversityService universityService)
        {
            this.universityService = universityService;
        }

        [HttpGet]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

        [HttpGet]
        public async Task<ServiceResult> GetUniversityStatues()
        {
            return await universityService.GetUniversityStatues();
        }
    }
}

【问题讨论】:

  • 你可以简单地写[HttpGet]它会自动获取动作名称。
  • 我试过了,但是不行。 @Justcode
  • 编辑后什么不起作用?你的控制台在说什么?
  • 我的控制台出现 404 错误@Justcode
  • 这个api怎么调用?显示网址

标签: c# .net asp.net-core-webapi asp.net-core-2.1


【解决方案1】:

像 MVC 这样的 Web API 的约定优于配置,所以如果你没有在属性中定义端点,它会起作用,但不会像你期望的那样。一般Get方法会像这个api/[ControllerName] post方法一样被调用。

在您的情况下,如果您需要将路由命名为与您的操作相同的名称,您可以在控制器上方编写此属性

[Route("[controller]/[action]")]

【讨论】:

  • 但是我的控制器中有很多操作,例如 GetUniversities、GetStudent、GetUniversityStatus 等。我的网址如何知道去哪里?@Jaffal
  • 根据发送的参数,如果您有多个设置相同参数的 get 方法,我认为您在调用此 API 时会遇到问题,这就是您需要定义路由名称的原因。我相信你不应该在一个控制器中拥有所有这些方法,遵循 RESTful API 标准restapitutorial.com/lessons/restfulresourcenaming.html 将实体作为资源处理,每个控制器负责一个资源。
  • 这在真实场景中是不可能的。因为,我认为我的项目中会有超过 10.000 次“获取”操作。如果我按照你说的做,将会有超过 10.000 个控制器。我想,这不是好事。您无法管理 10.000 个控制器。 @贾法尔
  • 你误会我的意思不是每个 get 方法的控制器,而是每个实体的控制器,例如大学控制器、学生控制器、成绩控制器等
  • 我明白了。但是例如,如果我们谈论universitycontroller,就会有getuniversitiesgetUniversityNamesgetUniversityStatusgetUniversityLocationNames 等。每次都会获得一个以上或多个帖子。在真实场景中永远不可能进行一次获取操作。我不知道,对吗?
【解决方案2】:

你可以只使用 [HttpGet]

    [HttpGet]
    public async Task<ServiceResult> GetUniversities()
    {
        return await universityService.GetUniversities();
    }

然后向http://localhost:5000/api/University发送一个get请求。它会正常工作。 但是你的问题是你有不止一个无参数的 get 方法。那么它就无法识别你需要调用哪个get方法。

所以如果你真的想在同一个控制器中使用两个无参数的 get 方法,你必须像这样装饰它,

   [HttpGet("GetUniversities")]
   public async Task<ServiceResult> GetUniversities()
   {
       return await universityService.GetUniversities();
   }

   [HttpGet("GetUniversityStatues")]
   public async Task<ServiceResult> GetUniversityStatues()
   {
       return await universityService.GetUniversityStatues();
   }

否则您必须将第二个控制器移动到另一个控制器

【讨论】:

  • 在我的真实场景@ThilinaSandunsiri 中,我的控制器中有 100 多个无参数“get”方法。 C# 并不聪明,我认为 :( .
  • [Route("api/[controller]/[action]")] 是我要找的。这解决了我的问题。通过这种方式,即使有多个无参数的 get 方法,我也可以不使用 methodName。 @ThilinaSandunsiri C# 聪明如我所愿 :)
【解决方案3】:

不需要使用Http Verb 传递方法名。你也可以这样使用:

        [HttpGet]
        public async Task<ServiceResult> GetUniversities()
        {
            return await universityService.GetUniversities();
        }

但是您想更改方法名称或路由。你可以这样:

        [HttpGet("", Name="Students"]
        public async Task<ServiceResult> GetStudents()
        {
            return await universityService.GetStudents();
        }

【讨论】:

  • 我试过 [HttpGet]。但是当我删除 ("GetUniversities") @Sandeep 时它会给出 404 错误
【解决方案4】:

你可以通过这个自动化一点

[HttpPost(nameof(GetUniversities))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 2013-08-26
    • 2020-05-22
    • 2011-01-06
    • 2011-07-09
    • 2012-01-25
    • 2011-10-30
    • 2016-10-02
    相关资源
    最近更新 更多