2011-07-24 68 views
3

我試圖發送一個使用POST請求base64編碼的數據,它包含「+」字符。當我發送請求時,「+」被替換爲「」(空格)。這裏去HttpWebRequest不發送+(加)字符

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; 
    } 

我一直在跟蹤「查詢」變量的代碼,它保持用「+」字符,但是當我看到嗅探器(查爾斯)的請求,該請求不被髮送「 +」。
比如我想送

< ...> ZXJ + ZZQ < ...>

< ...> ZXJ ZZQ < ...>

實際上是發送。
我在做什麼錯?
在此先感謝。

回答

9

+表示查詢字符串中的空格。它看起來像你發送的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亂搞,響應,流,編碼等...?

+0

非常感謝你! – Cracker

+0

適用於WPF 4.5應用程序,如魅力。 –

1

表單數據發送URL編碼,並且一個空格被編碼爲一個+,所以a +將被解碼爲一個空格。

使用Server.UrlEncode方法對要發送的數據進行編碼。

0

嘗試使用不同的內容類型:

hwrq.ContentType = "text/plain"; 

在你的榜樣,你發佈的原始的base64數據(明文),但你知道,你要發送一個URL編碼的查詢字符串(應用程序的遠程服務器/ X -www窗體-urlencoded)。這就是爲什麼遠程服務器嘗試對您的base64數據進行url解碼的原因,而這些數據又將用空格替換+。