使用 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