【问题标题】:C# HttpWebRequest of type "application/x-www-form-urlencoded" - how to send '&' character in content body?“application/x-www-form-urlencoded”类型的 C# HttpWebRequest - 如何在内容正文中发送“&”字符?
【发布时间】:2011-04-14 15:23:44
【问题描述】:

我正在用 C# 编写一个与 API 连接的小型应用程序。

我连接到一个 API,该 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”,则服务器只会获取“&”点之前的所有数据,所以我假设“&”使它看起来像在此之后的任何东西点属于新参数?

我该如何解决这个问题?

【问题讨论】:

  • 在发送之前对字符串进行编码?

标签: c# post httpwebrequest


【解决方案1】:

首先安装“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;

【讨论】:

  • 不确定我是否遗漏了什么,但这样请求就会挂起
  • OAuth2PostData 是什么?
  • @Kiquenet - 当您使用Content-Typeapplication/x-www-form-urlencoded 发布请求时,通常需要一些数据。我从为 OAuth2 身份验证编写的代码中复制了示例代码,因此变量名称为 OAuth2PostData。名称并不重要,它只是一个保存数据的变量。基本上就是KeyValuePair&lt;string, string&gt;的列表。
【解决方案2】:

由于您的内容类型是 application/x-www-form-urlencoded,您需要对 POST 正文进行编码,尤其是当它包含像 &amp; 这样在表单中具有特殊含义的字符时。

在将字符串写入请求流之前,尝试通过HttpUtility.UrlEncode 传递您的字符串。

这里有几个链接供参考。

【讨论】:

  • 第二个链接指向一些日本网站!
  • 谢谢!对我来说,我只需要转换我的字符串 strCallString = System.Web.HttpUtility.UrlEncode(strCallString) 然后再用 .ContentType = "application/x-www-form-urlencoded"
【解决方案3】:

只要服务器允许 POST 加号字符(并非所有都这样做,因为它可能不安全),您所要做的就是对字符进行 URL 编码。如果是与号,则应将字符替换为%26

.NET 为您提供了一种编码整个字符串的好方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2015-04-02
    • 1970-01-01
    • 2019-05-04
    • 2019-07-28
    • 1970-01-01
    • 2018-04-04
    • 2018-06-24
    相关资源
    最近更新 更多