【问题标题】:C# web request with POST encoding question带有 POST 编码问题的 C# Web 请求
【发布时间】:2011-02-27 01:49:58
【问题描述】:

在 MSDN 站点上有一个 example of some C# code,它显示了如何使用 POST 数据发出 Web 请求。以下是该代码的摘录:

WebRequest request = WebRequest.Create ("http://www.contoso.com/PostAccepter.aspx ");
request.Method = "POST";
string postData = "This is a test that posts this string to a Web server.";
byte[] byteArray = Encoding.UTF8.GetBytes (postData); // (*)
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();
WebResponse response = request.GetResponse ();
...more...

标有(*) 的行是令我困惑的行。不应该使用 UrlEncode 方法而不是 UTF8 对数据进行编码吗? application/x-www-form-urlencoded不就是这个意思吗?

【问题讨论】:

    标签: c# utf-8 urlencode


    【解决方案1】:

    示例代码具有误导性,因为 ContentType 设置为 application/x-www-form-urlencoded 但实际内容是纯文本。 application/x-www-form-urlencoded 是这样的字符串:

    name1=value1&name2=value2
    

    UrlEncode 函数用于转义“&”和“=”等特殊字符,因此解析器不会将它们视为语法。它接受一个字符串(媒体类型 text/plain)并返回一个字符串(媒体类型 application/x-www-form-urlencoded)。

    Encoding.UTF8.GetBytes 用于将字符串(在我们的示例中为媒体类型 application/x-www-form-urlencoded)转换为字节数组,这是 WebRequest API 所期望的。

    【讨论】:

    • application/x-www-form-urlencoded 可以包含非ASCII字符吗?我将此解释为不。 w3.org/TR/html401/interact/forms.html#h-17.13.4.1 还是我误会了?
    • 正如 Martin Smith 上面指出的,application/x-www-form-urlencoded 表示内容已以特定方式编码。使用 Encoding.UTF8 如何解决这个问题?
    • @Martin Smith:不知道。只需使用 UrlEncode 函数对名称和值进行编码,就可以了。我认为该示例使用 UTF8,因为这就是 C# 中的文字字符串。
    • @rlandster 我很确定它没有,如果 postdata 不是那么简单,您需要使用其他一些实用程序对其进行编码。我不确定您为什么要使用Encoding.UTF8.GetBytes 而不是Encoding.ASCII.GetBytes。编辑:我看到 Max 在上面发布了一个可能的解释。
    【解决方案2】:

    正如 Max Toro 所指出的,MSDN 网站上的示例是不正确的:正确的 POST 表单要求数据经过 URL 编码;由于 MSDN 示例中的数据不包含任何可以通过编码更改的字符,因此它们在某种意义上已经编码。

    正确的代码会在将每个名称/值对的名称和值组合成name1=value1&name2=value2 字符串之前调用System.Web.HttpUtility.UrlEncode

    此页面很有帮助:http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2016-08-03
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2015-09-15
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多