我可以使用相同的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 '的控制器匹配的类型。

我是不是忽略了一些基本的东西?

我已经通过将它们更改为genresgenres/{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方法?

我可以使用相同的HTTP方法和非变量uri创建多个API端点吗?

看起来这里有很多移动的部分,所以很难找出确切的解决所有问题的方法。但这里有几个问题需要解决…

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}")]