C# HttpWebRequest типа "application/x-www-form-urlencoded" - как отправить символ "&" в теле содержимого?
Я пишу небольшое приложение, связанное с API на C#.
Я подключаюсь к 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 в свой календарь.
Если у меня есть " " где-то в моем календаре (или аналогичном), сервер только получает все данные до точки "&", поэтому я предполагаю, что "&" делает его похожим на что-либо после того, как эта точка принадлежит новый параметр?
Как я могу это исправить?
3 ответа
Так как ваш тип контента application/x-www-form-urlencoded
вам нужно закодировать тело POST, особенно если оно содержит такие символы, как &
которые имеют особое значение в форме.
Попробуйте передать вашу строку через HttpUtility.UrlEncode, прежде чем записывать ее в поток запросов.
Вот пара ссылок для справки.
Сначала установите пакет nuget " Microsoft ASP.NET Web API Client":
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;
Пока сервер допускает отправку символа амперсанда (не все делают, поскольку это может быть небезопасно), все, что вам нужно сделать, это кодировать URL-адрес символа. В случае амперсанда вы должны заменить персонажа на %26
,
.NET предоставляет хороший способ кодирования всей строки для вас:
string strNew = "&uploadfile=true&file=" + HttpUtility.UrlEncode(iCalStr);