如何解决C# StreamWriter将字符串中'+'替换为空格的问题
解决POST请求中+字符被替换为空格的问题
嘿,这个问题我之前也踩过坑!原因很明确:你设置了ContentType = "application/x-www-form-urlencoded",而在这种表单编码规则里,+是被用来表示空格的——所以当请求内容被解析时,所有的+都会被自动替换成空格。
要保留+字符,你需要对包含+的变量做URL编码,把+转换成它对应的URL编码值%2B。这样服务器端解析的时候,就会把%2B还原回+,而不会当成空格处理。
具体怎么做呢?看下面的步骤:
- 如果你用的是.NET Framework,先引用
System.Web命名空间,然后用HttpUtility.UrlEncode()方法对headerVar进行编码; - 如果是.NET Core/.NET 5及以上版本,直接用
WebUtility.UrlEncode()(属于System.Net命名空间,无需额外引用); - 另外注意你代码里的
&是HTML实体,在表单参数里直接用&分隔参数就好,不用转义。
修改后的代码示例:
string headerVar = "W1wb948yHwyItOPOKC9P3+VPzQfVbP09yvY+X0"; public void Sorgula(string variable) { Application.DoEvents(); var request = (HttpWebRequest)WebRequest.Create("sample.com.tr?sID=" + variable); request.Headers.Add("X-Requested-With", "XMLHttpRequest"); request.CookieContainer = CookieJar; // 对headerVar进行URL编码,将+转为%2B string encodedHeaderVar = HttpUtility.UrlEncode(headerVar); // .NET Core/.NET 5+ 替换为:string encodedHeaderVar = WebUtility.UrlEncode(headerVar); // 拼接请求内容,用&分隔参数 string header = $"__HEADERVARIABLE={encodedHeaderVar}&OTHERHEADERVAR={otherVar}"; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; using (var streamWriter = new StreamWriter(request.GetRequestStream())) { streamWriter.Write(header); } }
这样处理后,写入请求流的内容会变成:__HEADERVARIABLE=W1wb948yHwyItOPOKC9P3%2BVPzQfVbP09yvY%2BX0&OTHERHEADERVAR=xxx
服务器端解析时,会自动把%2B转换回+,完美保留你想要的字符!
内容的提问来源于stack exchange,提问作者Eren Salihler
相关产品推荐
相关产品推荐

