2011-04-14 25 views
22

我正在用C#編寫一個小的API連接應用程序。類型爲「application/x-www-form-urlencoded」的C#HttpWebRequest - 如何在內容主體中發送'&'字符?

我連接到一個API,它有一個方法需要一個長字符串,一個日曆(ics)文件的內容。

我做這樣的:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); 
request.Method = "POST"; 
request.AllowAutoRedirect = false; 
request.CookieContainer = my_cookie_container; 
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
request.ContentType = "application/x-www-form-urlencoded"; 

string iCalStr = GetCalendarAsString(); 

string strNew = "&uploadfile=true&file=" + iCalStr; 

using (StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII)) 
{ 
    stOut.Write(strNew); 
    stOut.Close(); 
} 

這似乎工作的偉大,直到我在我的日曆添加一些特定HTML。

如果我有一個「& NBSP」在我的日曆(或類似)服務器只得到所有的數據到「&‘ - 點的地方,所以我假設’&」使它看起來像什麼此點後屬於一個新的參數?

我該如何解決這個問題?

+0

編碼發送之前的字符串? – 2011-04-14 15:29:50

+0

用%26替換&? – 2011-04-14 15:30:38

回答

8

只要服務器允許ampresand字符公佈(不是所有的事,因爲它可以是不安全的),你應該做的是URL編碼字符。在ampresand的情況下,您應該用%26替換該字符。

.NET提供編碼雖然整個字符串爲您的一個很好的方式:

string strNew = "&uploadfile=true&file=" + HttpUtility.UrlEncode(iCalStr); 
20

首先安裝「Microsoft ASP.NET Web API Client」 NuGet包:

PM > Install-Package Microsoft.AspNet.WebApi.Client 

然後用下面的函數來發表您的數據:

public static async Task<TResult> PostFormUrlEncoded<TResult>(string url, IEnumerable<KeyValuePair<string, string>> postData) 
{ 
    using (var httpClient = new HttpClient()) 
    { 
     using (var content = new FormUrlEncodedContent(postData)) 
     { 
      content.Headers.Clear(); 
      content.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 

      HttpResponseMessage response = await httpClient.PostAsync(url, content); 

      return await response.Content.ReadAsAsync<TResult>(); 
     } 
    } 
} 

這就是如何使用它:

TokenResponse tokenResponse = 
    await PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData); 

TokenResponse tokenResponse = 
    (Task.Run(async() 
     => await PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData))) 
     .Result 

或(不推薦)

TokenResponse tokenResponse = 
    PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData).Result; 
相關問題