【问题标题】:An error when sending PATCH with Postman to Asp.net Core webapi使用 Postman 向 Asp.net Core webapi 发送 PATCH 时出错
【发布时间】:2020-01-19 00:47:16
【问题描述】:

我有一个模特,

public class Order
{
    public Guid Id { get; set; }
    public IEnumerable<string> ItemIds { get; set; }
    public string Currency { get; set; }
}

还有一个存储库,

public interface IOrderRepository
{
    IEnumerable<Order> Get();
    Order Get(Guid id);
    void Add(Order order);
    void Update(Guid id, Order order);
    // other irrelevant code has been deleted for simplicity
}

public class MemoryOrderRepository : IOrderRepository
{
    private readonly IList<Order> _orders = new List<Order>();
    public IEnumerable<Order> Get() => _orders;

    public Order Get(Guid id) => _orders.FirstOrDefault(o => o.Id == id);
    public void Add(Order order) => _orders.Add(order);

    public void Update(Guid id, Order order)
    {
        var target = _orders.FirstOrDefault(o => o.Id == id);
        if (target != null) target.ItemIds = order.ItemIds;
    }
    // other irrelevant code has been deleted for simplicity
}

已在Startup.cs注册如下。

    public void ConfigureServices(IServiceCollection services) =>
        services.AddSingleton<IOrderRepository, MemoryOrderRepository>()
                .AddControllers()
                .AddNewtonsoftJson();

其他相关的nuget包已经安装如下。

<PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />

下面给出了一个测试控制器。

[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
    private readonly IOrderRepository repo;

    public OrderController(IOrderRepository repo)
    {
        this.repo = repo;
    }

    [HttpGet]
    public IActionResult Get() => Ok(repo.Get());

    [HttpGet("{id:guid}")]
    public IActionResult Get(Guid id) => Ok(repo.Get(id));

    [HttpPost]
    public IActionResult Post(Order order)
    {
        Order target = new Order()
        {
            Id = Guid.NewGuid(),
            ItemIds = order.ItemIds
        };

        repo.Add(target);

        return CreatedAtAction(nameof(Get), new { id = target.Id }, null);
    }

    [HttpPatch("{id:guid}")]
    public IActionResult Patch(Guid id, JsonPatchDocument<Order> order)
    {
        Order target = repo.Get(id);
        if (target == null)
            return NotFound(new { Message = $"Item with id {id} does not exist." });


        order.ApplyTo(target);
        repo.Update(id, target);
        return Ok();
    }

    // other irrelevant code is deleted for simplicity
}

使用 Postman,我成功创建了一个新订单,方法是先向服务器发送 POST 动词,然后通过发送 GET 动词确认结果,如下所示。

问题

我尝试使用以下内容部分更新订单,但失败了。

错误信息是

JSON 补丁文档格式错误,无法解析。

出了什么问题以及如何解决?

代替

{
    "ItemIds": ["xyz","123"]
}

我也试过了

{
    "op":"replace",
    "path":"/ItemIds",
    "value": ["xyz","123"]
}

两者都没有帮助。

【问题讨论】:

标签: c# asp.net-core postman asp.net-core-webapi webapi


【解决方案1】:

根据docs for json 补丁,您需要传递一个操作数组而不是单个对象,就像这样

[
  {
    "op":"replace",
    "path":"/ItemIds",
    "value": ["xyz","123"]
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2017-05-03
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2021-01-17
    • 2017-05-26
    • 2020-09-21
    相关资源
    最近更新 更多