【问题标题】:Encoding with HttpClient in .NET 4.5在 .NET 4.5 中使用 HttpClient 进行编码
【发布时间】:2012-06-13 15:57:31
【问题描述】:

我正在使用 XML API 处理一些数据。此 API 始终以 UTF-8 格式提供数据。

当使用WebClient 类发出请求时,我可以设置编码。例如:

var result = new WebClient(); 
result.Encoding = Encoding.UTF8;

但是HttpClient 类呢?

HttpClient client = new HttpClient();

我应该使用:

client.GetByteArrayAsync(url);

...然后将字节从编码(UTF-8)转换为字符串?

或者有没有办法直接将内容获取为UTF-8字符串?

using (var client = Connector.GetHttpClient())
{
    var byteData = await client.GetByteArrayAsync(url);
    data = Encoding.UTF8.GetString(byteData);
}

最后,这里是 XML 响应的摘录:

<?xml version="1.0" encoding="UTF-8"?>
<response>

【问题讨论】:

    标签: fogbugz c# .net unicode encoding dotnet-httpclient


    【解决方案1】:

    您应该能够使用GetStringAsync - 我希望编码由 HTTP 响应中的标头确定。如果服务器没有指定编码,那么您可能会要求修复它。

    或者,如果您要获取 XML 数据,只需将其作为字节数组获取并直接解析该二进制文件 - XML 声明应该指定非 UTF-8/UTF-16 数据的编码,所以我会争辩说,实际上这种方式出错的空间更小。

    【讨论】:

    • 嗨乔恩。谢谢你的回复。编码标签始终包含在响应中。在 FogBugz 案例中,它被定义为始终为 UTF-8。这是 XML .... 开头的示例。 ,所以如果没有记录的功能,我不确定再次信任 api :-( 所以获取 ByteArray(如我上面的代码示例)应该是最安全的方法?
    • @BoasEnkler:客户端不会从 body 中获取编码 - 它应该在 headers 中指定。但正如我所说,更安全的方法是将其作为字节获取并仅从二进制数据中解析它。 (创建一个MemoryStream 来包装字节数组。)
    • 好的,认为这是最好的解决方案。 Kris 也推荐了同样的东西 :)
    • 再问一个问题。在将字节包装在内存中并将其传递给 XELement.Load 时。这种方法在不再需要时会自动处理内存流吗?还是我自己处理?
    • 理论上你应该丢弃它。实际上,Dispose 对 MemoryStream 没有任何作用(它背后没有非托管资源)。
    【解决方案2】:

    如果我理解正确,你不需要字符串,你需要 XML。

    所以,假设你的数据不是太大,用

    读取一个字节数组
    byte[] bytes = await client.GetByteArrayAsync(url); 
    

    然后从该数组创建一个内存流,然后从该流中读取 XML,例如:

    XElement element = XElement.Load(new MemoryStream(bytes), LoadOptions.None);
    

    如果您使用的是其他 XML API,则可以使用

    XmlReader reader = XmlReader.Create(new MemoryStream(bytes));
    

    【讨论】:

    • 好主意。但我也想了解其他场景的预期行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-05-18
    相关资源
    最近更新 更多