C#中HttpWebRequest传递JSON参数时参数始终为空的问题
解决HttpWebRequest传JSON参数为空的问题
我之前也踩过一模一样的坑!明明请求能触发目标方法,但参数就是接收不到,结合你给出的代码片段,咱们从这几个核心点逐一排查:
1. 必须设置正确的请求头
这是最容易被忽略的关键!HttpWebRequest默认不会携带JSON类型的Content-Type,服务端根本不知道你传的是JSON,自然解析不了参数:
var request = (HttpWebRequest)WebRequest.Create("你的接口URL"); request.Method = "POST"; request.ContentType = "application/json; charset=utf-8"; // 一定要加这个! request.Accept = "application/json";
2. 确认JSON序列化的正确性
你用的ToJson()自定义方法可能存在问题,建议先把序列化后的字符串打印出来验证格式:
string JsonParameters = amount.ToJson(); Console.WriteLine(JsonParameters); // 确认输出是 {"currencyCode":"EUR","amount":1234} 这种标准JSON格式
如果自定义序列化不靠谱,直接用官方序列化库更稳妥:
// Newtonsoft.Json写法(适用于所有.NET版本) string JsonParameters = JsonConvert.SerializeObject(amount); // System.Text.Json写法(.NET Core/.NET 5+推荐) string JsonParameters = JsonSerializer.Serialize(amount);
3. 正确写入请求流
很多人写流时会忽略编码或流的状态,导致服务端读不到完整内容:
// 更稳妥的字节数组写入方式 byte[] byteData = Encoding.UTF8.GetBytes(JsonParameters); request.ContentLength = byteData.Length; // 手动设置内容长度避免异常 using (var stream = request.GetRequestStream()) { stream.Write(byteData, 0, byteData.Length); }
如果用StreamWriter,一定要记得Flush确保数据全部写入:
using (var streamWriter = new StreamWriter(request.GetRequestStream())) { streamWriter.Write(JsonParameters); streamWriter.Flush(); }
4. 验证服务端的接收逻辑
如果你的服务端是ASP.NET系列,要确保接口参数标记正确:
// ASP.NET Core示例,必须加[FromBody]标记 [HttpPost] public IActionResult YourTargetMethod([FromBody] Amount amount) { // 业务逻辑 }
要是服务端期望接收FormData而非JSON,那传JSON肯定会参数为空,这点也要确认。
完整验证示例
把以上要点整合,写个完整的请求代码测试:
Amount amount = new Amount { currencyCode = "EUR", amount = 1234 }; string json = JsonConvert.SerializeObject(amount); var request = (HttpWebRequest)WebRequest.Create("https://your-api-url.com/your-endpoint"); request.Method = "POST"; request.ContentType = "application/json; charset=utf-8"; byte[] data = Encoding.UTF8.GetBytes(json); request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { string result = reader.ReadToEnd(); // 处理返回结果 }
按这个步骤排查,大概率能解决参数为空的问题~
内容的提问来源于stack exchange,提问作者user3454910




