C#如何通过HttpWebRequest发送请求payload/请求正文
核心误区说明
StreamWriter本身不限制请求方法类型,你无法写入请求正文的本质原因是HttpWebRequest的默认机制:当请求方法为GET时,框架默认判定该请求不携带正文,会直接禁止调用GetRequestStream()获取写入流,和写入用的工具类无关。
具体实现方法
只要提前给请求对象配置好正文相关的标识参数,无论是什么请求方法(包括GET)都可以正常写入payload,步骤如下:
- 初始化请求对象后,显式指定你需要使用的
Method属性 - 提前计算payload的字节长度,给请求对象的
ContentLength属性赋值,或者将SendChunked属性设为true开启分块传输,这一步是告诉框架当前请求需要携带正文,绕过默认的无正文校验 - 根据payload类型设置对应的
ContentType(比如JSON对应application/json、表单对应application/x-www-form-urlencoded) - 正常获取请求流,用
StreamWriter或者直接写入字节数组即可,写完释放流后再发起请求
代码示例
// 初始化请求 var request = (HttpWebRequest)WebRequest.Create("/get"); // 指定请求方法,此处以GET为例,其他方法逻辑一致 request.Method = "GET"; // 待发送的payload内容 var payload = "{\"key\":\"value\"}"; var payloadBytes = Encoding.UTF8.GetBytes(payload); // 配置正文相关参数,ContentLength和SendChunked二选一即可 request.ContentLength = payloadBytes.Length; // request.SendChunked = true; request.ContentType = "application/json"; // 写入请求正文 using (var requestStream = request.GetRequestStream()) { requestStream.Write(payloadBytes, 0, payloadBytes.Length); // 如果要用StreamWriter写法,替换成以下代码即可 // using (var writer = new StreamWriter(requestStream, Encoding.UTF8)) // { // writer.Write(payload); // } } // 获取响应 using (var response = (HttpWebResponse)request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var reader = new StreamReader(responseStream, Encoding.UTF8)) { var result = reader.ReadToEnd(); // 处理响应逻辑 }
注意:HTTP 1.1规范没有明确禁止GET请求携带请求正文,但大量服务端框架、反向代理、CDN节点默认会直接丢弃GET请求的正文内容。使用前请确认你对接的服务端明确支持GET携带payload,否则优先改用POST/PUT等标准携带正文的请求方法,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者user1094183
相关产品推荐
相关产品推荐

