You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RestSharp对接Fake API实现Post/Put/Delete请求?遇反序列化错误

问题分析与解决方案

核心问题梳理

  1. Delete接口调用错误:dummyjson的删除接口要求通过路径参数传递ID(DELETE /products/{id}),而非Query参数,当前代码用AddQueryParameter不符合接口规范。
  2. JSON反序列化失败:ViewModel属性名与API返回字段不匹配(如RootViewModel中的Products应为小写products,API返回的是小写字段),或未正确配置RestSharp的序列化选项。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:40:16