首页 > 解决方案 > 在不提供位置 URI 的情况下返回 POST 响应

问题描述

我的 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 或返回的正确 ActionResult 是什么?

标签: c#asp.net-core

解决方案


  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
        };
    }
    

推荐阅读