web-dev-qa-db-ja.com

タイプ「application / x-www-form-urlencoded」のC#HttpWebRequest-コンテンツ本文に「&」文字を送信する方法は?

C#で小さなAPI接続アプリケーションを作成しています。

長い文字列を受け取るメソッドであるカレンダー(ics)ファイルのコンテンツを持つAPIに接続します。

私はこれを次のようにしています:

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」がある場合、サーバーは「&」ポイントまでのすべてのデータのみを取得するため、「&」はこのポイントに属するもののように見えると仮定しています新しいパラメーターですか?

どうすれば修正できますか?

32
nelshh

Content-typeはapplication/x-www-form-urlencodedであるため、特にフォームに特別な意味を持つ&のような文字が含まれる場合、POST bodyをエンコードする必要があります。

文字列を HttpUtility.UrlEncode に渡してから、要求ストリームに書き込みます。

参照用のリンクを次に示します。

25
Andy White

最初のインストール " 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;
36
Tohid

サーバーがampresand文字のPOSTを許可している限り(すべてが安全ではない可能性があるため、すべてを行うわけではありません)、必要なことは文字をURLエンコードすることだけです。アンプレッサンドの場合、文字を%26に置き換える必要があります。

.NETは、文字列全体をエンコードする素晴らしい方法を提供します。

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