>我正在尝试使用世界银行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() }