【问题标题】:"Http failure response for http://localhost:49540/api/create/: 404 Not Found" Angular 11 POST request“http://localhost:49540/api/create/ 的 Http 失败响应:404 Not Found” Angular 11 POST 请求
【发布时间】:2021-07-01 11:45:06
【问题描述】:

我目前正在使用 Angular 11 开发一个使用 .Net 5 API 的客户端应用程序。 API 获取请求按预期工作,但是当我发送 POST 请求时它失败并显示错误提示

POST http://localhost:49540/api/create/ 404(未找到)
http://localhost:49540/api/create/ 的 Http 失败响应:404 Not Found

我尝试删除末尾的斜杠,但没有帮助。

这是我的 API 操作方法

[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
    [HttpPost]
    [Route("create")]
    public async Task<IActionResult> AddBook(CreateBook model)
    {
        var book = mapper.Map<Book>(model);

        // Replace value with userManager.GetUserId(User); 
        try
        {
            book.CreatedByUserId = Fakes.Faker.FakeUserId();
            book.DateCreated = DateTime.Now;
            book.BookStatus = BookStatus.Available;
            book.BookId = new Guid();

            return Ok(await bookService.AddAsync(book));
        }
        catch (Exception ex)
        {
            return StatusCode(StatusCodes.Status500InternalServerError, new ResponseMessage
            {
                Succeeded = false,
                Errors = new List<string>() { ex.Message }
            });
        }
    }
 }

客户端代码

addBook(book: CreateBook): Observable<CreateBook> {
 return this.httpClient.post<CreateBook>(baseURL + 'create', book, {
   headers: new HttpHeaders({
     'Content-Type': 'application/json'
   })
 }).pipe(catchError(this.handleError));
}

handleError(errorResponse: HttpErrorResponse): Observable<never> {
   if (errorResponse instanceof ErrorEvent) {
      console.error("Client side error: ", errorResponse);
   } else {
      console.error("Server side Error: " + errorResponse.message);
   }
  return throwError("Message");
}

我已将 CORS 配置为允许任何标头、方法和来源。 问题是什么?是我的代码还是遗漏了什么?我很困惑,因为 get 请求正常工作,post 请求也在 Swagger 中工作。

【问题讨论】:

  • 尝试从网址中删除/api/。控制器上有路由属性吗?
  • 是的,检查代码
  • 我在你的 action 上看到了一个 Route 属性,我在问 controller(类)上是否有一个属性。哪个网址给你 200?
  • 那么您在 url 中缺少控制器的名称。
  • 是的。它应该是 api/books/create

标签: c# angular


【解决方案1】:

您当前的网址失败,因为您在路径中缺少一个片段。要了解原因,让我们看看您的控制器的 [Route] 属性。

[Route("api/[controller]")]

这意味着 url 的路径段必须以 /api/Books 开头,因为您的控制器名为“Books”(这通过获取类名并从末尾删除“Controller”一词(如果存在)来实现)。

然后将其附加到 action 的 [Route] 属性。

[Route("create")]

所以完整的预期 url 路径是 /api/Books/create。如果你愿意,“书籍”也可以是小写的,无论哪种方式,代码都会理解。

如需进一步阅读,请参阅Routing in ASP.NET Core - Microsoft Docs

【讨论】:

    【解决方案2】:

    只需更改您的操作路线属性

    [HttpPost]
     [Route("~/api/create")]
     [Route("~/api/books/create")]
    public async Task<IActionResult> AddBook(CreateBook model)
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多