HttpWebRequest发送POST请求却转为GET,请求协助排查
解决POST请求被转为GET的问题
先看你代码里的几个关键问题,这些都可能导致服务器无法正确处理你的POST请求,进而出现方法被意外转为GET的情况:
- 重复且错误的Content-Type头:你既设置了
request.ContentType = "application/json";,又通过request.Headers.Add添加了拼写错误的appication/json(少了字母l)。重复的头信息会让服务器困惑,甚至触发错误处理流程,导致请求方法异常变更。 - 错误的编码格式:你用了
UnicodeEncoding来编码JSON数据,但JSON标准要求使用UTF-8编码。UTF-16的编码会让服务器无法正确解析请求体,进而引发异常。 - 不规范的JSON格式:你的
myData里的键名to和body没有用双引号包裹,这不符合JSON语法规范。服务器解析失败后可能返回错误,甚至触发重定向逻辑。
另外,虽然你关闭了自动重定向,但如果服务器在处理错误请求时返回3xx状态码,即使不自动跳转,也可能引发请求方法被转为GET的情况——根源还是请求本身的错误导致服务器异常响应。
下面是修正后的完整代码:
string myURI = "https://api.bulksms.com/v1/messages"; string myUsername = "******"; string myPassword = "******"; // 修正JSON格式,键名添加双引号以符合标准语法 string myData = "{\"to\": \"7777777777\", \"body\":\"Hello Mr. Mbhele!\"}"; HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create(myURI); request.AllowAutoRedirect = false; request.MaximumAutomaticRedirections = 0; request.Credentials = new NetworkCredential(myUsername, myPassword); request.PreAuthenticate = true; request.Method = "POST"; // 只设置一次正确的Content-Type头 request.ContentType = "application/json"; // 使用UTF-8编码,匹配JSON标准要求 var encoding = new System.Text.UTF8Encoding(); var encodedData = encoding.GetBytes(myData); // 使用using语句自动释放流资源,避免泄漏 using (var stream = request.GetRequestStream()) { stream.Write(encodedData, 0, encodedData.Length); } try { // 用using包裹响应和阅读器,自动释放资源 using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } catch (WebException ex) { Console.WriteLine("An error occurred:" + ex.Message); if (ex.Response != null) { using (var reader = new StreamReader(ex.Response.GetResponseStream())) { return reader.ReadToEnd(); } } // 处理无响应的边界情况 return null; }
额外优化说明:
- 用
using语句自动管理流和响应对象的生命周期,避免资源泄漏。 - 在catch块中增加
ex.Response != null的判断,防止空引用异常。 - 修正了JSON格式,确保符合标准语法要求。
你可以先尝试这些修正,应该能解决请求被转为GET的问题。如果还是有异常,建议在catch块中打印响应的状态码和内容,这能帮你进一步排查服务器返回的具体错误。
内容的提问来源于stack exchange,提问作者LMDev
相关产品推荐
相关产品推荐

