c# - CreatedAtRoute CreatedAtAction 不返回正确的响应
问题描述
我有以下代码,如果我向 CreateBook 发出帖子调用,它会成功返回,但响应如下
{
"id": "a0add985-60f1-4adc-e15e-08d7d51b721a",
"title": "string",
"description": "string",
"amountOfPages": null,
"authorId": "2902b665-1190-4c70-9915-b9c2d7680450",
"author": null
}
如果我理解正确,它应该通过传递 authorId 和 bookID 来调用函数 getBook,它会返回针对该书和作者的值,而不是来自 bookToAdd 的书?请告诉我,谢谢各位。
/// <summary>
/// Get a book by id for a specific author
/// </summary>
/// <param name="authorId">The id of the book author</param>
/// <param name="bookId">The id of the book</param>
/// <returns>An ActionResult of type Book</returns>
/// <response code="200">Returns the requested book</response>
[HttpGet("{bookId}",Name = "GetBook")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<Book>> GetBook(
Guid authorId,
Guid bookId)
{
if (! await _authorRepository.AuthorExistsAsync(authorId))
{
return NotFound();
}
var bookFromRepo = await _bookRepository.GetBookAsync(authorId, bookId);
if (bookFromRepo == null)
{
return NotFound();
}
return Ok(_mapper.Map<Book>(bookFromRepo));
}
/// <summary>
/// Create a book for a specific author
/// </summary>
/// <remarks> default 2902B665-1190-4C70-9915-B9C2D7680450</remarks>
/// <param name="authorId">The id of the book author</param>
/// <param name="bookForCreation">The book to create</param>
/// <returns>An ActionResult of type Book</returns>
/// <response code="422">Validation error</response>
[HttpPost()]
[Consumes("application/json")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status422UnprocessableEntity,
Type = typeof(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary))]
public async Task<ActionResult<Book>> CreateBook(
Guid authorId,
[FromBody] BookForCreation bookForCreation)
{
if (!await _authorRepository.AuthorExistsAsync(authorId))
{
return NotFound();
}
var bookToAdd = _mapper.Map<Entities.Book>(bookForCreation);
bookToAdd.AuthorId = authorId;
_bookRepository.AddBook(bookToAdd);
await _bookRepository.SaveChangesAsync();
//return CreatedAtAction(
// nameof(GetBook),
// new { authorId = authorId, bookId = bookToAdd.Id },
// //new { version = HttpContext.GetRequestedApiVersion().ToString(), authorId, bookId = bookToAdd.Id },
// bookToAdd);
return CreatedAtRoute(
routeName: "GetBook",
routeValues: new { authorId = authorId, bookId = bookToAdd.Id },
value: bookToAdd
);
}
解决方案
这不是如何CreatedAtRoute
工作的。它所做的只是设置一个标头,以便客户端知道所创建资源的位置。请参阅 HTTP 状态 201
在您的示例中,它将像这样在响应上设置标头
Location: https://example.com/api/Book/GetBook/123
您的CreateBook
端点将返回bookToAdd
推荐阅读
- azure - 使用默认 Databricks 文件系统或默认 DBFS 或 DBFS 根的哪种数据加密?
- javascript - 无法将文件对象从 reactjs 发送到 nodejs
- node.js - 在 node.js 中使用来自控制器的 fastify-redis
- oracle - 在 Oracle 12c 中创建具有分区年和子分区月的表
- android - 最适合创建闹钟应用程序的语言/框架?
- swift - 在切换到 UITabbarController 中的不同选项卡之前关闭当前选项卡上的推送视图控制器
- sap-cloud-platform - 错误 - 无法为本地连接添加“SAP-Connectivity-Authentication”标头
- maven - maven传递依赖错误版本
- javascript - 使用来自多个 Fetch API 请求的变量
- c - 将 uint8_t 数组参数传递给除 uint32_t 之外的子例程(从 uint8_t 数组转换为 uint32_t 数组)