最近在学习.Net Core
使用Asp.net Mvc Core3.1 创建了一个WebApi项目,在项目中安装了NSwag ,因第一次使用遇到了个问题,就是发现Controller控制器中只能有一个Get请求,想了解一下这种情况如何解决,需要有多个Get请求的Action方法
麻烦了
actionname, route 加
刚看到,不好意思,因是新手没太明白你的意思,方便细说下吗?麻烦了
注:我这边方法名都是不一样的,比如说aaa、和bbb2个方法名,都是[HttpGet]属性的
@释通明:
如果是Api项目,必须要标明Route,因为他的route规则类似是:“{httpMethod} {controller}/{id?}”
[HttpGet("Get1")] //==> " Get {controller/get1}"
public void Action1(){}
[HttpGet("Get2")] //==> " Get {controller/get2}"
public void Action1(){}
[HttpPost("Get3")] //==> " Post {controller/get3}"
public void Action3(){}
Api项目里面controller里面不带http[post,put,等]的一个public action方法默认解析为httpget方法。
@czd890: 明白了,谢谢了
是那个默认路由规则的问题。控制器里的方法是不能重名的。
这是 API 规范,每个 url 表示要访问的资源,http 方法表示要对资源执行的操作,get 查,post 增,put 改,delete 删。动作名一般就是这4个,当然方法名一般也直接用这4个。如果发现你想写多个 get 或者 post 什么的,你应该想的是这两个 get 是不是操作完全相同的资源,如果不是,他们应该在不同的控制器中。
比如 Users 控制器,有个 get 方法,作用是查询用户列表,如果你还想加一个 get 查一个用户,实际上你应该重新写一个控制器叫 User,表示访问单个用户。
也就是说单个对象访问和对象集合访问应该是不同的控制器,哪怕集合访问只有 get。
记住一个原则,一个 api 控制器就是同一个资源4个相关的增删查改动作。哪怕资源长得再像,比如上面的单体和集合,只要不是完全相同的类型,都应该独立控制器,这样你会发现 api 控制器实际上不存在多个 get 这种问题。甚至有些时候相同类型的资源也会有多个控制器,来应对复杂需求。
不要老想着怎么在一个控制器里多加几个 get,换个思路,怎么把这些 get 拆到多个控制器里。不然为什么人家微软不让你这么路由,不是不支持(MVC 可以一个控制器好几个 get 就代表技术完全支持),是这么用就不对。