问题 如何使用HttpWebRequest在POST中转义URL编码数据


我正在尝试将URL编码的帖子发送到用PHP实现的REST API。 POST数据包含两个用户提供的字符串:

WebRequest request = HttpWebRequest.Create(new Uri(serverUri, "rest"));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Headers.Add("Content-Transfer-Encoding", "binary");

// Form the url-encoded credentials we'll use to log in
StringBuilder builder = new StringBuilder();
builder.Append("user=");
builder.Append(user);
builder.Append("&password=");
builder.Append(password);
byte[] credentials = Encoding.UTF8.GetBytes(builder.ToString());

// Write the url-encoded post data into the request stream.
request.ContentLength = credentials.Length;
using (Stream requestStream = request.GetRequestStream()) {
  requestStream.Write(credentials, 0, credentials.Length);
}

这会向包含的服务器发送HTTP请求 user=myusername&password=mypassword 在UTF-8中作为其POST数据。

如何逃避用户提供的字符串? 例如,如果我有一个名为的用户 big&mean,如何对抗&符号进行转义,以免它弄乱请求线?


4863
2018-06-21 23:24


起源



答案:


你可以使用静态 HttpUtility System.Web中的类,用于编码和解码HTML和Url相关的值。

尝试 HttpUtility.UrlEncode()


17
2018-06-21 23:36



谢谢!如果我在包含UTF-8字符的字符串上使用该方法,例如德语s-z,UTF-8代码对将变为 %c3%9f。我认为这意味着 Content-Transfer-Encoding 应该设置为 7bit 现在? - Cygon
您可以使用HttpUtility.UrlEncode提供的参数之一是编码。 '%'后面使用的字符数取决于编码。 - pauloya


答案:


你可以使用静态 HttpUtility System.Web中的类,用于编码和解码HTML和Url相关的值。

尝试 HttpUtility.UrlEncode()


17
2018-06-21 23:36



谢谢!如果我在包含UTF-8字符的字符串上使用该方法,例如德语s-z,UTF-8代码对将变为 %c3%9f。我认为这意味着 Content-Transfer-Encoding 应该设置为 7bit 现在? - Cygon
您可以使用HttpUtility.UrlEncode提供的参数之一是编码。 '%'后面使用的字符数取决于编码。 - pauloya


看起来System.Web已经过时了 - 访问它的新方法是 System.Net.WebUtility.HtmlEncode


-3
2017-07-07 20:13



HtmlEncode用于转义HTML中的数据,而不是URL。 - Ralf
HtmlEncode与UrlEncode不同。 HtmlEncode会将“<”转换为“&lt;”,而UrlEncode会将其转换为“%3c”。 - User 00000