HttpWebResponse的编码问题

本文关键字:问题 编码 HttpWebResponse | 更新日期: 2023-09-27 18:19:12

用Fiddler运行下面的代码显示加号被转换为某种形式的空白字符。我应该使用什么编码来防止数据被转换?我想保留加号等。

EDIT:更新的代码示例

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();

HttpWebResponse的编码问题

由于变量名为postData,我将假设您正在向web服务器发送HTTP POST。

维基百科对HTTP POST规则的总结是:

当web浏览器从web表单元素发送POST请求时默认的Internet媒体类型为"application/x-www-form-urlencoded"。这是一种编码可能重复的键值对的格式钥匙。每个键值对由'&'字符分隔,并且每个键与它的值之间用'='字符分隔。键和值都通过用'+'字符替换空格来转义,然后在所有其他非字母数字字符上使用URL编码。

也就是说,HTTP POST正文中'+'的默认解释是一个编码的' '字符。您需要通过调用Uri来正确地转义数据。EscapeDataString或httutility . urlencode .

Uri.EscapeDataString("test+PlusSigns"); // returns "test%2BPlusSigns"

或者,使用HttpUtility。UrlEncodeToBytes并将结果字节直接写入请求流(不使用StreamWriter)。

(注意,如果发送键/值对,则需要独立转义每个键和值,然后用'=''&'字符将它们连接起来。)

试试这个:

string postData =  Uri.EscapeDataString("test+PlusSigns");
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(postData);
writer.Close();
HttpWebResponse Response = (HttpWebResponse)request.GetResponse();
Response.Close();

您最多可以设置请求内容类型

myReq.ContentType = "text/html; charset=UTF-8";