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

如何在C#中将列表转为JSON对象数组并发起HTTP POST请求?

问题描述

我需要调用API验证用户地址,需发送包含JSON对象数组的POST请求。现有以下代码片段,想实现生成JSON键值对列表并通过C#的HttpClient发起请求:

获取用户信息的函数

public virtual CheckUserResult AddressErrors(User user ){
    var addressList  = new List<Address>();
    foreach (var userData in user.Address)
            {
                addressList.Add(userData); // 修正小写add为大写Add
            }
     var addressErrors = userClient.ValidateAddress(addressList.ToArray());       
   
}

待实现的请求函数

public virtual IList<ValidationError> ValidateAddress(Address[] addressList)
{
    // 需要实现HTTP POST逻辑
}

Address类定义

public class Address
{
    public string state { get; set; }
    public string city { get; set; }
    public int pincode { get; set; }
}

预期JSON格式

[{
    "state" : "A",
    "city" : "B",
    "pincode" : 1
},
{
    "state" : "E",
    "city" : "F",
    "pincode" : 2
}]

Postman请求示例(需用HttpClient实现相同逻辑)

var client = new RestClient("http://test/api/useraddresscheck");
var request = new RestRequest(Method.POST);
request.AddHeader("Postman-Token", "59398d8b-b5c6-c244-9db7-0e690104048c");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Client_Secret", "abc");
request.AddHeader("Client_ID", "erd");
request.AddParameter("undefined", "[{
 \"state\" : \"A\",
 \"city\" : \"B\",
 \"pincode\" : 1,
 \"fulladdress\" : \"\"
},
{
 \"state\" : \"E\",
 \"city\" : \"F\",
 \"pincode\" : 2,
 \"fulladdress\" : \"\"
}]
", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

请问如何在C#中生成JSON键值对对象列表并使用HttpClient发起POST请求?


解决方案

步骤1:完善Address类

Postman请求里包含fulladdress字段,需给Address类添加该属性,确保序列化后的JSON和请求示例一致:

public class Address
{
    public string state { get; set; }
    public string city { get; set; }
    public int pincode { get; set; }
    public string fulladdress { get; set; } = string.Empty; // 默认空字符串,匹配Postman示例
}

步骤2:优化AddressErrors方法

无需手动循环添加,直接将用户地址集合转成数组即可:

public virtual CheckUserResult AddressErrors(User user)
{
    // 直接将用户的地址集合转为数组,无需循环
    var addressArray = user.Address.ToArray();
    var addressErrors = userClient.ValidateAddress(addressArray);
    // 补充返回逻辑,根据实际CheckUserResult结构调整
    return new CheckUserResult { Errors = addressErrors };
}

步骤3:用HttpClient实现ValidateAddress方法

使用原生HttpClient(建议复用实例,避免频繁创建),结合System.Text.Json序列化地址数组完成POST请求:

// 建议将HttpClient作为单例注入,避免重复创建导致socket耗尽
private readonly HttpClient _httpClient;

// 构造函数注入HttpClient(依赖注入场景)
public UserClient(HttpClient httpClient)
{
    _httpClient = httpClient;
    _httpClient.BaseAddress = new Uri("http://test/"); // 设置API基础地址
}

public virtual async Task<IList<ValidationError>> ValidateAddress(Address[] addressList)
{
    // 1. 序列化地址数组为JSON字符串
    var jsonContent = JsonSerializer.Serialize(addressList, new JsonSerializerOptions
    {
        WriteIndented = true // 可选,格式化JSON,和示例格式一致
    });

    // 2. 创建请求内容
    var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

    // 3. 添加请求头
    _httpClient.DefaultRequestHeaders.Clear();
    _httpClient.DefaultRequestHeaders.Add("cache-control", "no-cache");
    _httpClient.DefaultRequestHeaders.Add("Client_Secret", "abc");
    _httpClient.DefaultRequestHeaders.Add("Client_ID", "erd");
    // Postman-Token是Postman自动生成的标识,实际请求无需添加(除非API明确要求)

    // 4. 发送POST请求
    var response = await _httpClient.PostAsync("api/useraddresscheck", content);

    // 5. 校验响应状态,非2xx状态码直接抛出异常
    response.EnsureSuccessStatusCode();

    // 6. 读取并反序列化响应内容
    var responseJson = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<IList<ValidationError>>(responseJson);
}

补充说明

  • HttpClient复用:禁止在方法内每次创建HttpClient,建议通过依赖注入注册为单例或静态实例,避免socket资源耗尽。
  • 序列化配置:如果API要求字段名严格匹配,可调整JsonSerializerOptions,比如使用JsonNamingPolicy.CamelCase适配驼峰命名(当前Address类字段已是小写,无需额外配置)。
  • 错误处理:示例中用EnsureSuccessStatusCode处理非成功状态码,实际项目可根据API返回的错误信息自定义异常捕获和处理逻辑。

内容的提问来源于stack exchange,提问作者its me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:15:39