使用Fiddler运行以下代码显示加号已转换为某种类型的空白字符。我应该使用什么编码来保持数据不被转换?我想保留加号等等。
编辑:更新了代码示例
string postData = "test1=test+plussign&test2=another++twoplussigns";
private static byte[] EncodePostData(string postData)
{
StringBuilder sb = new StringBuilder();
string[] pairs = postData.Split('&');
foreach (string pair in pairs)
{
string key = Uri.EscapeDataString(pair.Split('=')[0]);
string value = Uri.EscapeDataString(pair.Split('=')[1]);
sb.AppendFormat("{0}={1}&",key, value);
}
sb.Remove(sb.Length - 1, 1);
return HttpUtility.UrlEncodeToBytes(sb.ToString());
}
这是调用方法
byte[] data = EncodePostData(postData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.03";
request.CookieContainer = cookies;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
ServicePointManager.Expect100Continue = false;
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
HttpWebResponse Response = (HttpWebResponse)request.GetResponse();
Response.Close();
答案 0 :(得分:2)
由于您的变量名为postData
,我将假设您正在向Web服务器发送HTTP POST。
当Web浏览器从Web表单元素发送POST请求时, 默认的Internet媒体类型是“application / x-www-form-urlencoded”。 这是一种用于编码可能重复的键值对的格式 键。每个键值对由'&'分隔人物,每个人 key通过'='字符与其值分隔。键和值 通过用'+'字符替换空格然后转义 在所有其他非字母数字字符上使用URL编码。
也就是说,HTTP POST主体中'+'
的默认解释是编码的' '
字符。您需要通过调用Uri.EscapeDataString或HttpUtility.UrlEncode来正确转义数据。
Uri.EscapeDataString("test+PlusSigns"); // returns "test%2BPlusSigns"
或者,使用HttpUtility.UrlEncodeToBytes并将结果字节直接写入请求流(不使用StreamWriter
)。
(请注意,如果您要发送键/值对,则需要单独转义每个键和值,然后使用'='
和'&'
个字符加入它们。)
答案 1 :(得分:1)
试试这个:
string postData = Uri.EscapeDataString("test+PlusSigns");
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(postData);
writer.Close();
HttpWebResponse Response = (HttpWebResponse)request.GetResponse();
Response.Close();
答案 2 :(得分:-1)
您可以做的最大值是设置请求内容类型
myReq.ContentType = "text/html; charset=UTF-8";