如何在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
相关产品推荐
相关产品推荐

