使用 .NET 4.5 中的 HttpClient 进行编码

9
我正在使用 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>
2个回答

11
你应该能够使用GetStringAsync - 我期望编码应该由HTTP响应中的标头确定。如果服务器没有指定编码,则可能需要请求进行修复。
或者,如果你正在获取XML数据,只需将其作为字节数组获取并直接解析二进制数据-对于非UTF-8 / UTF-16数据,XML声明应该指定编码,因此我认为这种方式实际上有更少的错误空间。

嗨Jon。感谢您的回复。编码标签始终包含在响应中。 在FogBugz案例中,它被定义为始终是UTF-8。 以下是XML开头的示例<?xml version="1.0" encoding="UTF-8"?> <response>....我在webclient中依赖于此,但是API没有遵守编码,所以我不敢再次信任API而没有记录的功能:-(因此,获取ByteArray(如上面的代码示例)应该是最安全的方式? - Boas Enkler
1
@BoasEnkler:客户端不会从body中获取编码格式-应该在headers中指定。但正如我所说,更安全的方法是以字节形式获取它并仅从二进制数据中解析它。(创建一个MemoryStream来包装字节数组。) - Jon Skeet
好的,我认为那是最好的解决方案。Kris 也推荐了同样的做法 :) - Boas Enkler
1
理论上你应该Dispose它。但实际上,对于MemoryStream来说,Dispose什么也不做(因为它背后没有非托管资源)。 - Kris Vandermotten
@BoasEnkler:基本上就是Kris所说的。如果你只是使用XElement.Parse解析数据,那么在解析完数据后可以立即将其丢弃。但如果你从中创建了一个XmlReader,那就不同了,因为它会保留对流的引用,所以只有在需要数据时才能读取它。 - Jon Skeet
显示剩余2条评论

5
如果我理解正确,你不需要一个字符串,而是需要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));

不错的想法。但我也想了解其他情况下的预期行为。 - Boas Enkler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接