c# - 在不提供位置 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 是什么?
解决方案
报名
回复 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 }; }
推荐阅读
- c# - 是否可以将数据从 C# 类库返回到调用它的 VBA 模块?如果是这样,方法是什么?
- java - 如何在测试容器上将端口从容器公开到容器?
- angular - 注销删除令牌但令牌仍存储在服务中
- python - 如何在 django 模型中创建自定义函数?
- linux-kernel - 为 Linux 编译树外驱动程序的详细信息
- microsoft-graph-api - Mircrosoft Graph API:列出驱动器中的所有 DriveItems:badRequest
- rust - Rust:错误[E0495]:由于需求冲突,无法推断 autoref 的适当生命周期
- excel - 这个 VBA 函数总是返回 0 的答案
- r - 如何使用 ggplot 绘制矩阵
- javascript - 不是使用字符串的模板语法的函数错误