使用 Postman 向 Asp.net Core webapi 发送 PATCH 时出错

Posted

技术标签:

【中文标题】使用 Postman 向 Asp.net Core webapi 发送 PATCH 时出错【英文标题】:An error when sending PATCH with Postman to Asp.net Core webapi 【发布时间】: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"]

两者都没有帮助。

【问题讨论】:

docs.microsoft.com/en-us/aspnet/core/web-api/… 您的示例似乎不在数组中? [ ... ] 【参考方案1】:

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

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

【讨论】:

以上是关于使用 Postman 向 Asp.net Core webapi 发送 PATCH 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Postman 收到简单的 ASP.NET Core Web API 的 404 错误

如何在 IdentityServer ASP.NET Core 中使用 Postman 使用 AntiForgeryToken 调用 API

使用 Postman 登录 Angular ASP.NET CORE 应用程序

即使在使用 ASP.NET CORE Web Api 启用 CORS 后,仍然可以通过 POSTMAN 访问 API [重复]

阻止对 ASP.NET Core 3.1 API 的服务器到服务器或 Postman 调用

Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API