C# HttpClient发送POST请求前如何校验JSON请求体正确性
HTTP POST请求发送前校验请求体内容的实现方案
你可以通过以下两种路径完成请求体校验,覆盖不同的代码场景:
方案1:序列化阶段前置校验(推荐)
不需要等请求内容赋值到HttpRequestMessage.Content后再反向读取,直接把序列化JSON的步骤单独拆分,在赋值前完成所有校验,性能更好也不会出现内容流读取后无法发送的兼容问题。
改造后的代码示例:
// 注意:异步方法非事件场景不要用async void修饰,否则异常无法正常捕获,建议返回Task public async Task TestAuthentication() { var client = new HttpClient(); var request = new HttpRequestMessage() { RequestUri = new Uri("http://test"), Method = HttpMethod.Post }; var jsonObj = new { data = "eneAZDnJP/5B6r/X6RyAlP3J", }; // 单独持有序列化后的JSON字符串 string requestBody = JsonConvert.SerializeObject(jsonObj); // 此处插入你的校验逻辑 // 1. 校验JSON格式合法性 JObject parsedJson = JObject.Parse(requestBody); // 格式错误会直接抛出异常 // 2. 校验必填字段 if (parsedJson["data"] == null || string.IsNullOrWhiteSpace(parsedJson["data"].ToString())) { throw new InvalidOperationException("请求体缺失必填参数data"); } // 3. 调试阶段可以直接打印内容肉眼核对 Console.WriteLine($"待发送请求体:{requestBody}"); // 校验通过后再赋值给请求Content request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); }
方案2:已赋值Content后反向读取校验
如果你的请求构造逻辑分散,已经完成Content赋值后需要做校验,可以直接调用Content自带的异步读取方法拿到内容:
// 读取已设置的请求体内容 string existedBody = await request.Content.ReadAsStringAsync(); // 复用上述校验逻辑即可 Console.WriteLine($"当前已配置的请求体内容:{existedBody}");
兼容提示:.NET Core 3.1及更低版本中,HttpContent读取后流指针会移到末尾,直接发送可能出现内容为空的问题,读取后重新用拿到的字符串初始化一次StringContent赋值给request.Content即可;.NET 5及以上版本默认支持内容重复读取,不需要额外处理。
常用校验维度
- 格式校验:通过JSON解析方法判断序列化结果是否是合法JSON格式,避免序列化配置错误导致的格式问题
- 字段校验:检查接口要求的必填参数是否存在、值格式/长度是否符合接口约定
- 配置校验:确认Content编码为UTF-8、Content-Type头为
application/json,和实际传输内容匹配 - 敏感信息校验:如果有合规要求,检查请求体是否意外携带了未授权的敏感字段
内容的提问来源于stack exchange,提问作者ddb20
相关产品推荐
相关产品推荐

