返回 POST 响应,而不提供位置 URI



我的 API 项目中有一个注册和登录路由。注册路由应返回创建的用户,登录路由应返回 json Web 令牌。

我想知道当我不想提供位置 URI 时返回什么作为响应。Created需要一个位置 URI

return Created("what to pass in here", user);

CreatedAtAction也一样

return CreatedAtAction("what to pass in here", null, user);

我也尝试只这样返回结果

return user;

但是状态代码是 200 而不是 201。我尝试简化我当前的代码

[HttpPost("signUp")]
public async Task<ActionResult<User>> SignUp(UserCredentialsDto userCredentialsDto)
{
User user = null; // create a new user
return null; // return a 201 with the user
}
[HttpPost("signIn")]
public async Task<ActionResult<string>> SignIn(UserCredentialsDto userCredentialsDto)
{
string token = ""; // generate a new token
return null; // return a 201 with the token
}

如何省略两个终结点的位置 uri,或者返回的正确操作结果是什么?

  1. 注册

    用 201 响应是完全正确的,因为您创建了一个新资源,这是一个user。返回路由以获取全新资源是一种良好的 api 做法。在下面的示例中,响应对象将包含指向Location标头的此路由。

    [HttpPost]
    [Route("SignUp")]
    public ActionResult<User> SignUp()
    {
    var newUser = new User() { Id = 1 };
    return Created($"/users/{newUser.Id}/test1", newUser);
    }
    
  2. 登录

    恕我直言,最好只使用200 OK因为在请求令牌时不会创建新资源。返回什么代码是一个单独的主题,所以我提供了一种实现下面要求的方法。这个想法只是使用ContentResult实例并显式指定代码:

    [HttpPost]
    [Route("SignIn")]
    public ActionResult<string> SignIn()
    {
    return new ContentResult
    {
    Content = "token",
    ContentType = "text/plain",
    StatusCode = 201
    };
    }