【问题标题】:Getting HTTP 404 error in a POST request - C#在 POST 请求中出现 HTTP 404 错误 - C#
【发布时间】:2018-07-09 06:11:30
【问题描述】:

我正在尝试创建新的 customerId 和 orderId。 然后它将显示一个新订单并检索创建的代码 201。 我不明白为什么代码不起作用。我有什么遗漏吗?

为此工作了几天,但没有运气。 希望你能看到我哪里出错了。

仍然是编程新手,非常感谢您的帮助。

代码如下:

型号:

using System.Collections.Generic;

namespace Project.Models
{
    public class Customer
    {
       public string CustomerId { get; set; }
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string DateOfBirth { get; set; }
    }

   public class Order
   {
       public string OrderId { get; set; }
       public string Product { get; set; }
       public string Status { get; set; }
       public double Price { get; set; }
   }

    public class CustomerOrder
    {
      public string CustomerId {get; set;}
      public string OrderId { get; set; }
    } 
}

存储库:

using System.Collections.Generic;
using System.Linq;
using Project.Models;
using System.Net;
using System.Collections.Specialized;
using System.Text;


namespace Project.Repositories
{
   public class OrderRepository
   {

       private static List<Order> _Orders;
       private static List<CustomerOrder> _CustomerOrder;

       static OrderRepository()
       {
           _Orders = new List<Order>();
           _CustomerOrder= new List<CustomerOrder>();

           _Orders.Add(new Order
           {
               OrderId = "124",
               Product= "Shirts",
               Status= "On it's way",
               Price= 100.20,
           });

           _Orders.Add(new Order
           {
               OrderId= "122",
               Product= "Pants",
               Status= "Not ready",
               Price= 300.30,
           });

           _Orders.Add(new Order
           {
               OrderId= "143",
               Product= "Deadpool",
               Status= "On it's way",
               Price= 6.20,
           });

           _Orders.Add(new Order
           {
               OrderId= "156",
               Product= "Socks",
               Status= "Not ready",
               Price= 3.30,
           });

           _CustomerOrder.Add(new CustomerOrder
           {
               CustomerId = "578",
               OrderId = "156",
           });
}

public static void SaveNewCustomerOrder(string customerId, string orderId, CustomerOrder customerOrder)
{
    order.CustomerID = customerId;
    order.OrderId= orderId;
    Order.Add(order);
}

控制器:

OrderController.cs:

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Project.Models;
using Project.Repositories;

namespace Project.Controllers
{
   public class OrderController : Controller
   {
      [HttpPost("customers/{customerId}/orders/{orderId}/overview")]
       public IActionResult Post([FromRoute] string customerId, string orderId, [FromBody] CustomerOrder customerOrder)
       {
          OrderRepository.SaveNewCustomerOrder(customerId, orderId, customerOrder);

          return Ok();
       }
    }
 }

【问题讨论】:

  • 您的请求正文和网址是什么?
  • @D-Shih URL : http://localhost:5000/customers/{customerId}/orders/{orderId}/overview 请求正文应为customerId and orderId。如果这就是你的要求?
  • 您可以创建一个无参数 GET 操作,以检查端点是否完全响应。也许这与您的设置有关?
  • 不工作是什么意思?你显示代码说它不起作用。什么是预期的行为和实际发生了什么?只有这样,我们才能提供一些帮助,而不是猜测 not working 发生了什么。使用相关详细信息更新问题。
  • @Nkosi 我希望显示新订单并检索已创建的代码 201。

标签: c# .net post asp.net-core


【解决方案1】:
[HttpPost("customers/{customerId}/orders/{orderId}/overview")]
public IActionResult Post([FromRoute] string customerId, [FromRoute] string orderId, [FromBody] CustomerOrder customerOrder)
{
    OrderRepository.SaveNewCustomerOrder(customerId, orderId, customerOrder);

    return Ok();
}

我认为不是您要寻找的答案,而是开始添加 orderID 像 [fromRoute] 参数,当您进行调试时,您在参数中看到正确的值吗?您使用的是 aspnet .core 2.0 吗?

您确定路径正确吗?我在之前的评论中读到了这个: http://localhost:5000/customers/{customerId}/orders/{orderId}/overview

检查是这个路径: http://localhost:5000/api/customers/{customerId}/orders/{orderId}/overview

【讨论】:

  • 请使用答案部分仅提供解决方案,您可以在问题下的cmet中询问信息,如果您无法发表评论,请等待OP澄清自己。
  • Visual Studio 代码中的调试无法按预期工作,因为它没有命中我指定的任何标记。我正在使用 .core 2.0,是的。
  • 所以你收到错误 404 因为你的 URL 有问题,我很确定你的 URL 没有找到
【解决方案2】:

你应该更新你的 HttpPost("Path")

根据thisthis

最好用

[RoutePrefix("Path")] 带有类/控制器和

[Route("Path")]Action Method 装饰器。

【讨论】:

    【解决方案3】:

    我已经复制了您的代码,但您的预期存在一些问题。

    1)

    public static void SaveNewCustomerOrder(string customerId, string orderId, CustomerOrder customerOrder)
    {
        order.CustomerID = customerId;
        order.OrderId= orderId;
        Order.Add(order);
    }
    

    在该方法中,您尝试添加 customerId 和 orderId,但它们不属于订单类。然后,您尝试将此订单添加到订单列表中。 我认为您可能打算传递订单而不是客户订单。我有以下类和控制器工作:

    控制器:

    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.AspNetCore.Mvc;
    using ben22.Repositories;
    using ben22.Models.Models;
    
    namespace ben22.Controllers
    {
        public class OrderController : Controller
        {
            [HttpPost("customers/{customerId}/orders/{orderId}/overview")]
            public IActionResult Post([FromRoute] string customerId, string orderId, [FromBody] Order order)
            {
                OrderRepository.SaveNewCustomerOrder(customerId, orderId, new Order());
    
                return Ok();
            }
        }
    }
    

    更新了 SaveNewCustomerOrder:

    public static void SaveNewCustomerOrder(string customerId, string orderId, Order order)
    {
        var newCustomer = new CustomerOrder
        {
            CustomerId = customerId,
            OrderId = orderId
        };
        _CustomerOrder.Add(newCustomer);
    
        _Orders.Add(order);
    
    }
    

    点击以下端点(替换 yourPort):

    http://localhost:{yourPort}/customers/1/orders/2/overview

    主体:

    {
      "orderId": "55",
      "product": "Football",
      "status": "Approved",
      "price": 9.99
    }
    

    此外,如果这不起作用,我会在 Visual Studio 中检查您的 launchUrl,并可能重新启动它。

    【讨论】:

    • 我正在使用 Visual Studio 代码,有什么重新启动 launchUrl 的想法吗? =p 但我会试试你的解决方案,看看效果如何。
    • 仅供参考,我使用邮递员但端点。如果您使用邮递员,请确保从请求类型中选择帖子。
    • 我试过邮递员,这很奇怪。它通过 customerId 和 orderId 就好了,但我得到 null 顺序 _Orders.Add(order); 所以它不会创建新订单。
    • 您是如何发送请求的?你能发布你更新的 saveNewCustomerOrder 方法吗?
    • 如果使用 Postman,请确保您已将请求设置为 POST。在 Body 中,选择 raw 并添加我之前提供的 Body 代码。
    【解决方案4】:

    假设如下

    我希望显示一个新订单并检索已创建的代码 201

    以下内容仅作为上述请求的演示示例,并非直接取自您的示例。

    public class OrderController : Controller {
        //...removed for brevity
    
        //POST "customers/578/orders/1576/overview
        [HttpPost("customers/{customerId}/orders/{orderId}/overview")]
        public IActionResult Post(string customerId, string orderId) {
            var order = orderRepository.CreateNewCustomerOrder(customerId, orderId);
            if(order == null) {
                return BadRequest();
            }
            //return 201 created status code along with 
            //the route name, route value, and the actual object that is created
            return CreatedAtRoute("GetOrder", new { orderId = order.OrderId }, order);
        }
    
        //GET orders/157
        [HttpGet("orders/{orderId}", Name = "GetOrder")]
        public IActionResult GetOrder(string orderId) {
            var order = orderRepository.GetOrder(orderId);
            if(order == null) {
                return NotFound();
            }
            return Ok(order);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2018-05-27
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多