没有属性名称的Http get和post方法

时间:2018-11-05 07:03:43

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

我正在使用.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();
        }
    }
}

4 个答案:

答案 0 :(得分:2)

像MVC这样的Web API具有配置约定,因此,如果您未在属性中定义端点,它将起作用,但不会如您所愿。通常,Get方法的调用方式类似于此api / [ControllerName] post方法。

对于您而言,如果您需要为路线命名与操作名称相同,则可以在控制器上方编写此属性

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin


User = get_user_model()


class UserAdmin(BaseUserAdmin):
    fieldsets = (
        (None, {'fields': ('phone_number', 'password')}),
        ('Bio', {'fields': ('first_name', 'last_name', 'address', 'birth_date')})
    )

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('phone_number', 'password1', 'password2')
        })
    )

    search_fields = ('phone_number', 'full_name')
    list_display = ('phone_number', 'full_name', 'admin', 'staff', 'active')
    list_filter = ('admin', 'staff', 'active')
    ordering = ('phone_number',)
    filter_horizontal = ()


admin.site.register(User, UserAdmin)
admin.site.unregister(Group)

答案 1 :(得分:1)

您只能使用[HttpGet]

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

然后将获取请求发送到http://localhost:5000/api/University。它将正常工作。 但是您的问题是您拥有多个不带参数的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();
   }

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

答案 2 :(得分:0)

不需要通过Http Verb传递方法名称。您也可以这样使用:

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

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

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

答案 3 :(得分:0)

您可以通过此方式使其自动化

C:\Windows\system32\cmd.exe