【问题标题】:Failed to load resource: the server responded with a status of 404 ()加载资源失败:服务器响应状态为 404 ()
【发布时间】:2020-07-04 10:11:15
【问题描述】:

我正在.net 核心中编写一个 REST API。我正在尝试使用 Postman 测试 API,但出现错误提示

加载资源失败:服务器响应状态为404()

我知道当路由不匹配时会发生此错误。不确定,我在路线上做错了什么。下面是我的代码,顶部是路线:

namespace RecLoad.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class RecLoadPrimeController : ControllerBase
    {
        [Route("RecLoadPrime/insertRecLoadData/{RecStartDate}/{RecEndDate}")]
        [HttpPost]
        public void insertRecLoadData(string RecStartDate, string RecEndDate)
        {
            RecLoadDataProvider dataProvider = new RecLoadDataProvider();
            dataProvider.InsertCardsData(RecStartDate, RecEndDate);
        }
    }
}

我要在 Postman 中测试的 URL 如下:

 https://localhost:44360/api/RecLoadPrime/insertRecLoadData/?RecStartDate=01/01/2020&RecEndDate=01/02/2020

我对 API 很陌生,这是我编写的第一个 API。下面是应用程序结构的图像。它非常简单:

任何帮助将不胜感激。

【问题讨论】:

  • 请注意,您指定 RecStartDate 和 RecEndDate 是路径的一部分,但像查询参数一样传递它们 - 决定您要走哪条路。显然,在您的真实代码中,您使用 ISO81- (xkcd.com/1179) 作为日期值,因此放入路径或查询参数应该没问题。
  • 所以我需要更改任何内容,否则代码和 URL 看起来不错。

标签: c# rest api .net-core


【解决方案1】:

404 错误表示未找到。这意味着 Postman 无法找到您要达到的终点。

  1. 您的[Route] 属性需要更新。这个端点(控制器)的根是RecLoadPrime。所以摆脱那部分。如果您只是想测试,请将其更新为[Route("insert")]
    • 在您的 URL 中使用 ? 意味着您正在传递查询参数。通常用于 GET 请求而不是 POST 请求。
    • Web API 要求您使用模型绑定来传递参数。这意味着将 post 参数映射到强类型的 .NET 对象,而不是单个参数。或者,您也可以在 API 方法中接受 FormDataCollection 参数,以获取所有 POST 值的名称值集合。
    • 例如:创建一个名为Card 的小类,其属性为startDateendDate。让他们DateTime。现在在方法签名中使用它public void insertRecLoadData([FromBody]Card card)
  2. 在 Postman 中,您现在将使用 Body 选项并为我们创建的这个新类创建一个 JSON 表示。
    • 例如:{ "startDate": "2020-03-23", "endDate": "2020-03-27" }
    • 在路由中,你要使用:POST | https://localhost:44360/api/insertRecLoadData/insert

确保在控制器中设置断点。不确定您是如何设置项目的,但我建议您阅读有关如何使用 ASP.NET Core 设置 Web API 的更多信息。研究 RESTful 设计以了解如何最好地设置这些端点。

祝你好运!

【讨论】:

    【解决方案2】:

    您的控制器和您的操作上的当前路由配置将导致您的路由中出现重复的部分。具体来说,动作关联的路由是“api/RecLoadPrime/RecLoadPrime/insertRecLoadData/{RecStartDate}/{RecEndDate}”。

    考虑从您的操作路由属性中删除 RecLoadPrim/ 前缀,如下所示:

     [Route("insertRecLoadData/{RecStartDate}/{RecEndDate}")]
    

    【讨论】:

    猜你喜欢
    • 2016-11-01
    • 2018-01-29
    • 1970-01-01
    • 2019-07-04
    • 2021-11-20
    • 2018-02-26
    • 2015-04-16
    相关资源
    最近更新 更多