我的 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,或者返回的正确操作结果是什么?
-
注册
用 201 响应是完全正确的,因为您创建了一个新资源,这是一个
user
。返回路由以获取全新资源是一种良好的 api 做法。在下面的示例中,响应对象将包含指向Location
标头的此路由。[HttpPost] [Route("SignUp")] public ActionResult<User> SignUp() { var newUser = new User() { Id = 1 }; return Created($"/users/{newUser.Id}/test1", newUser); }
-
登录
恕我直言,最好只使用
200 OK
因为在请求令牌时不会创建新资源。返回什么代码是一个单独的主题,所以我提供了一种实现下面要求的方法。这个想法只是使用ContentResult
实例并显式指定代码:[HttpPost] [Route("SignIn")] public ActionResult<string> SignIn() { return new ContentResult { Content = "token", ContentType = "text/plain", StatusCode = 201 }; }