我可以使用相同的HTTP方法和非变量uri创建多个API端点吗?
本文关键字:创建 uri API 端点 变量 可以使 方法 HTTP 我可以 | 更新日期: 2023-09-27 18:13:57
我定义了两个API端点:
[Route("create")]
[HttpPost]
[ResponseType(typeof(User))]
public async Task<IHttpActionResult> CreateUser(User user)
[Route("login")]
[HttpPost]
[ResponseType(typeof (User))]
public async Task<IHttpActionResult> Login(string email, string password)
控制器定义为
[RoutePrefix("api/users")]
public class UserController : ApiController
当我用这个信息调用它时(在纯chrome中,我的应用程序和Postman应用程序)
POST /api/users/login HTTP/1.1
Host: mysite.azurewebsites.net
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
email=somemail&password=somepw
我收到404:
{
"Message": "No HTTP resource was found that matches the request URI 'http://mysite.azurewebsites.net/api/users/login'.",
"MessageDetail": "No action was found on the controller 'User' that matches the request."
}
它确实适用于另一条路由,我可以用/api/users/1
调用:
[Route("{id:int}")]
[HttpGet]
[ResponseType(typeof(User))]
public async Task<IHttpActionResult> GetUser(int? id)
我不能明确定义这样的端点吗?我试着创建一个自定义路由,但这没有区别(我把它放在默认路由之前和调用config.MapHttpAttributeRoutes()
之后)。
config.Routes.MapHttpRoute(
name: "Login",
routeTemplate: "api/users/login",
defaults: new { controller = "User", action = "Login" }
);
请注意,显式地将路由定义为[Route("~api/users/login")]
也不起作用。
我也注意到,路由在我的其他控制器似乎不再工作了。更具体地说,我有这些定义:
[RoutePrefix("api/movies")]
public class MovieController : BaseController
[Route("~api/genres")]
[HttpGet]
[ResponseType(typeof(IEnumerable<Genre>))]
public IHttpActionResult GetGenres()
[Route("~api/genres/{id:int}")]
[HttpGet]
[ResponseType(typeof(IEnumerable<MovieResult>))]
public IHttpActionResult GetMoviesForGenre(int id)
[Route("{id:int}")]
[HttpGet]
[ResponseType(typeof(Movie))]
public IHttpActionResult GetMovieDetails(int id)
在这些选项中,只有对/api/movies/16
的调用成功,其他返回
没有找到与名为' types '的控制器匹配的类型。
我是不是忽略了一些基本的东西?
我已经通过将它们更改为genres
和genres/{id:int}
并添加此路由使类型路由再次可用
config.Routes.MapHttpRoute(
name: "test",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
,但我认为这是不必要的。由于某种原因,请求/api/movies/genres
工作,而/api/users/login
没有。我确实注意到,创建一个GET方法与URI /api/users/genres
DOES工作,所以我相信它必须与之有关。为什么它找不到我的post方法?
看起来这里有很多移动的部分,所以很难找出确切的解决所有问题的方法。但这里有几个问题需要解决…
Web API(不像MVC)只能从请求体中读取一个参数。因此,为了使您的Login
操作工作,请尝试创建LoginInfo
类…
public class LoginInfo
{
public string email { get; set; }
public string password { get; set; }
}
并将Login方法更改为…
public async Task<IHttpActionResult> Login([FromBody]LoginInfo loginInfo)
类型的问题似乎是在属性路由中错误地使用了~
(应该是~/
)。试一试…
[Route("~/api/genres")]
和
[Route("~/api/genres/{id:int}")]