httppost 远程服务器返回错误: (400) 错误的请求错误

本文介绍了一个使用C#实现的HTTP POST请求方法,该方法能够发送JSON格式的数据到指定URL,并接收响应。文章特别强调了字符编码设置的重要性,指出在使用UTF-8编码而非GB2312时可以避免因中文字符导致的错误请求问题。
public static string HttpPost(string Url, string postDataStr)
        {
            string result = "";
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.Method = "POST";
                request.ContentType = "application/json";
                // request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);

                Stream myRequestStream = request.GetRequestStream();
                //如果为gb2312,参数中有汉字时会发生错误: 
                //远程服务器返回错误: (400) 错误的请求。      
                StreamWriter myStreamWriter =
                    new StreamWriter(myRequestStream, Encoding.GetEncoding("utf-8"));

                myStreamWriter.Write(postDataStr);
                myStreamWriter.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = 
                    new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                result = retString;
                myStreamReader.Close();
                myResponseStream.Close();
            }
            catch (Exception ex)
            {
                LogHelper.Error("", ex);
            }
            return result;
        }

注意这一句

StreamWriter myStreamWriter =
                    new StreamWriter(myRequestStream, Encoding.GetEncoding("utf-8"));

如果为gb2312,参数中有汉字时会发生错误。远程服务器返回错误: (400) 错误的请求。


### HTTP 400 Bad Request 错误的原因分析 HTTP 400 Bad Request 表示客户端发送的请求存在语法错误,服务器无法解析并处理该请求[^3]。此错误可能由多种因素引起,包括但不限于: - 请求头或正文格式不正确。 - 数据中包含非法字符(如 `\0`),导致服务端拒绝接收[^4]。 - 配置参数不足,例如 WCF 中未设置足够的缓存容量来支持大数据传输[^2]。 - 客户端传递了 `null` 或其他不符合预期的数据结构作为参数[^5]。 以下是针对上述问题的具体解决方案及其技术实现方法。 --- ### 解决方案一:检查并修正请求数据格式 如果请求体或头部存在问题,则需验证其是否遵循目标 API 的规定标准。例如,在 C# 中构建 POST 请求时应确保 JSON 序列化无误: ```csharp using System.Net.Http; using Newtonsoft.Json; public async Task<string> PostDataAsync(string url, object data) { var jsonContent = JsonConvert.SerializeObject(data); // 将对象序列化为JSON字符串 using (var client = new HttpClient()) { HttpContent content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); HttpResponseMessage response = await client.PostAsync(url, content); if (!response.IsSuccessStatusCode) throw new Exception($"Request failed with status code {response.StatusCode}"); return await response.Content.ReadAsStringAsync(); } } ``` --- ### 解决方案二:移除非法字符 当上传文件或者提交表单时,某些特殊字符可能会触发异常行为。可以通过预处理输入数据的方式规避此类风险。下面是一个简单的过滤函数用于删除不可见字符`\0`: ```csharp public static string RemoveNullCharacters(string input) { if (string.IsNullOrEmpty(input)) return ""; char[] filteredChars = Array.FindAll<char>(input.ToCharArray(), c => !char.IsControl(c)); return new string(filteredChars); } // 使用实例 string cleanText = RemoveNullCharacters(originalStringWithSpecialChar); Console.WriteLine(cleanText); ``` --- ### 解决方案三:调整 Web Service 参数配置 对于基于 Windows Communication Foundation(WCF)的服务应用来说,适当增大消息大小限额有助于避免因超出默认限制而引发的错误情况发生。编辑 App.config 文件如下所示即可完成相应设定更改操作: ```xml <bindings> <basicHttpBinding> <binding name="LargeMessageTransfer" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> <!-- 设置readerQuotas属性 --> <readerQuotas maxDepth="32" maxArrayLength="2147483647" maxBytesPerRead="2147483647"/> </binding> </basicHttpBinding> </bindings> <!-- 然后指定绑定名称给endpoint --> <services> <service name="YourNamespace.YourServiceClass"> <endpoint address="" binding="basicHttpBinding" contract="IYourContractInterface" /> </service> </services> ``` --- ### 解决方案四:防止 Null 参考变量 确认所有必要的字段都已赋值而非 null 。以列表为例,初始化为空集合而不是留作 null 能有效减少潜在隐患 : ```csharp List<int> myList = new List<int>(); // 正确做法 if(myList != null && myList.Count >0){ Console.WriteLine("List contains elements."); }else{ Console.WriteLine("Empty or uninitialized list detected!"); } ``` 通过以上措施可以显著降低遭遇 HTTP 400 错误的概率,并提高系统的稳定性和兼容性。 --- ####
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值