2011-07-24 5 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クラスを拡張することができ:今

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メソッドを使用します。あなたは(プレーンテキスト)生base64のデータを投稿、しかし、あなたは、URLエンコードされたクエリ文字列を掲示しているリモートサーバー(アプリケーション/ Xを伝えるあなたの例では

hwrq.ContentType = "text/plain"; 

0

は異なるコンテンツタイプを使用してみてください-www-form-urlencoded)。そのため、リモートサーバーはbase64データのデコードを試みますが、これは+をスペースで置き換えます。

関連する問題