我正在尝试使用POST请求发送base64编码数据,它包含“+”字符。当我发送请求时,“+”被替换为“”(空格)。这里是代码
public string POST(string url, string query)
{
HttpWebRequest hwrq = CreateRequest(url);
hwrq.CookieContainer = Cookies;
hwrq.Method = "POST";
hwrq.ContentType = "application/x-www-form-urlencoded";
byte[] data = Encoding.Default.GetBytes(query);
hwrq.ContentLength = data.Length;
hwrq.GetRequestStream().Write(data, 0, data.Length);
using (HttpWebResponse hwrs = (HttpWebResponse)hwrq.GetResponse())
{
using (StreamReader sr = new StreamReader(hwrs.GetResponseStream()))
{
return sr.ReadToEnd().Trim();
}
}
}
public HttpWebRequest CreateRequest(string url)
{
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url);
Request.UserAgent = UserAgent;
Request.Accept = Accept;
Request.Headers.Add("Accept-Language", AcceptLang);
Request.AutomaticDecompression = DMethod;
return Request;
}
我一直在跟踪“查询”变量,它保留了“+”字符,但是当我在嗅探器(Charles)中看到请求时,请求是在没有“+”的情况下发送的。
例如,我正在尝试发送
< ...> ZXJ + ZZQ< ...>
和
< ...> zxJ zZq< ...>
实际上已发送
我做错了什么?
提前谢谢。
答案 0 :(得分:10)
+
表示查询字符串中的空格。它看起来像您发送的query
变量没有正确的URL编码。遗憾的是,您还没有展示如何构建此query
字符串变量,但这是正确的方法,以确保所有值都正确进行URL编码:
var values = HttpUtility.ParseQueryString(string.Empty);
values["foo"] = "some + value";
values["bar"] = "some other value";
string query = values.ToString();
// query will equal foo=some+%2b+value&bar=some+other+value
请注意最初属于该值的+
符号如何编码为%2B
。
如果您写下以下内容:
string query = "foo=some + value&bar=some other value";
我认为您会看到自己的问题以及正确的查询字符串foo=some+%2b+value&bar=some+other+value
之间的区别。
现在这里说的是我建议你改进你的代码。您可以扩展WebClient
类,以便它可以处理cookie,如下所示:
public class WebClientEx : WebClient
{
public CookieContainer Cookies { get; private set; }
public WebClientEx()
{
Cookies = new CookieContainer();
}
protected override WebRequest GetWebRequest(Uri address)
{
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = Cookies;
return request;
}
}
现在简单地说:
using (var client = new WebClientEx())
{
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0";
client.Headers[HttpRequestHeader.AcceptLanguage] = "en-us,en;q=0.5";
var values = new NameValueCollection
{
{ "foo", "some value" },
{ "bar", "some & other + value =" },
};
byte[] buffer = client.UploadValues("http://www.example.com", values);
string result = Encoding.UTF8.GetString(buffer);
}
看看这是多么容易,而不是乱搞所有那些HttpWebRequests,响应,流,编码等......?
答案 1 :(得分:1)
表格数据以URL编码发送,空格编码为+,因此+ +将被解码为空格。
使用Server.UrlEncode方法对要发送的数据进行编码。
答案 2 :(得分:0)
尝试使用其他内容类型:
hwrq.ContentType = "text/plain";
在您的示例中,您发布了原始base64数据(纯文本),但是您告诉远程服务器您正在发布一个url编码的查询字符串(application / x-www-form-urlencoded)。这就是远程服务器尝试对你的base64数据进行url解码的原因,而base64数据又将替换为空格。