如何用RestSharp对接Fake API实现Post/Put/Delete请求?遇反序列化错误
问题分析与解决方案
核心问题梳理
- Delete接口调用错误:dummyjson的删除接口要求通过路径参数传递ID(
DELETE /products/{id}),而非Query参数,当前代码用AddQueryParameter不符合接口规范。 - JSON反序列化失败:ViewModel属性名与API返回字段不匹配(如
RootViewModel中的Products应为小写products,API返回的是小写字段),或未正确配置RestSharp的序列化选项。 - Post/Put方法未实现:缺少针对dummyjson创建、更新接口的请求构造逻辑。
修正与完整实现代码
1. 修正ViewModel(匹配API字段)
确保属性名与dummyjson返回的JSON字段完全一致:
public class ProductViewModel { public int id { get; set; } public string title { get; set; } public string description { get; set; } public int price { get; set; } public double discountPercentage { get; set; } public double rating { get; set; } public int stock { get; set; } public string brand { get; set; } public string category { get; set; } public string thumbnail { get; set; } public List<string> images { get; set; } } public class RootViewModel { // 改为小写,匹配API返回的"products"字段 public ProductViewModel[] products { get; set; } public int total { get; set; } public int skip { get; set; } public int limit { get; set; } }
2. 完善ProductClient(含Delete/Post/Put实现)
配置RestSharp序列化选项,同时实现正确的请求逻辑:
public class ProductClient { private readonly string _baseUrl = "https://dummyjson.com/products"; private readonly RestClient _client; public ProductClient() { var options = new RestClientOptions(_baseUrl) { // 配置序列化选项,支持大小写不敏感(可选,确保字段匹配) SerializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true } }; _client = new RestClient(options); } // 修正Delete方法:使用路径参数 public async Task<ProductViewModel> Delete(int id) { var request = new RestRequest("/{id}"); request.AddUrlSegment("id", id); var response = await _client.DeleteAsync<ProductViewModel>(request); return response; } // 实现Post(创建产品) public async Task<ProductViewModel> Create(ProductViewModel product) { // dummyjson创建产品的接口路径是/products/add var request = new RestRequest("/add", Method.Post); // 传递请求体(自动序列化为JSON) request.AddJsonBody(product); var response = await _client.PostAsync<ProductViewModel>(request); return response; } // 实现Put(更新产品) public async Task<ProductViewModel> Update(int id, ProductViewModel product) { var request = new RestRequest("/{id}", Method.Put); request.AddUrlSegment("id", id); request.AddJsonBody(product); var response = await _client.PutAsync<ProductViewModel>(request); return response; } }
3. 修正Controller方法
[ApiController] [Route("api/[controller]")] public class ProductController : ControllerBase { private readonly ProductClient _client; public ProductController(ProductClient client) { _client = client; } [HttpDelete("{id}")] public async Task<IActionResult> Delete(int id) { var deletedProduct = await _client.Delete(id); return Ok(deletedProduct); } [HttpPost] public async Task<IActionResult> Create([FromBody] ProductViewModel product) { var createdProduct = await _client.Create(product); return CreatedAtAction(nameof(Create), new { id = createdProduct.id }, createdProduct); } [HttpPut("{id}")] public async Task<IActionResult> Update(int id, [FromBody] ProductViewModel product) { var updatedProduct = await _client.Update(id, product); return Ok(updatedProduct); } }
关键注意事项
- 接口路径匹配:dummyjson的产品接口规则:
- 删除:
DELETE /products/{id} - 创建:
POST /products/add - 更新:
PUT /products/{id}
- 删除:
- 序列化配置:通过
PropertyNameCaseInsensitive = true可以避免因大小写不一致导致的反序列化错误,也可以直接保持ViewModel属性名与API字段完全一致。 - 返回值处理:RestSharp的泛型方法(如
DeleteAsync<T>)会自动反序列化响应为指定类型,无需手动处理JSON。
内容的提问来源于stack exchange,提问作者Kaan Yılmazer
相关产品推荐
相关产品推荐

