使用 StreamReader 和 WebResponse 的编码问题



>我正在尝试使用世界银行API读取XML流。有问题的 URL 现在在我的 Web 浏览器中http://api.worldbank.org/country?per_page=100运行良好并返回一个 XML 文档。

但是,这在 FSI 中不会很好地发挥作用。流基本上是一堆垃圾,根据XML文档和响应标头,内容的编码是UTF-8,我已经将StreamReader设置为使用该编码,但它似乎没有帮助。

这是代码:

let downloadUrl(url:string) = 
    async { let request = HttpWebRequest.Create(url)
            use! response = request.AsyncGetResponse()
            let stream = response.GetResponseStream()
            use reader = new StreamReader(stream, Text.Encoding.UTF8)
            return! Async.AwaitTask <| reader.ReadToEndAsync() }
我想

通了,显然返回的流是GZip压缩的,所以我不得不更改代码,以便它使用自动解压缩。我应该提到..这不是非常健壮的代码,因为除了HttpWebRequest之外HttpWebRequest.Create还可以返回其他内容,理想情况下,我会在模式匹配中使用类型检查来确定返回的类型,但这适用于我的目的,因为我知道我只会使用它HttpWebRequests

let downloadUrl(url:string) = 
    async { let request = HttpWebRequest.Create(url) :?> HttpWebRequest
            request.AutomaticDecompression <- DecompressionMethods.GZip
            use! response = request.AsyncGetResponse()
            let stream = response.GetResponseStream()
            use reader = new StreamReader(stream, Text.Encoding.UTF8)
            return! Async.AwaitTask <| reader.ReadToEndAsync() }

最新更新