アップストリーム API を Scalatra アプリケーションでラップし、Dispatch を使用して非同期リクエストを作成しています。しかし、上流の XMLxml.Elems
を Dispatch の組み込み XML 処理サポートを使用するように変換するのに問題があります。
Dispatch ドキュメントにあるものとかなり似たようなことをしようとしています。つまり、上流の XML を取得して再処理を行います。問題の関数は次のようになります。
def facilitiesSvc = {
val myhost = host("upstream.api.co.uk") / "organisations" / "foo" / "123" / "bar" / "core.xml"
myhost.addQueryParameter("apikey", "123456")
myhost
}
def facilitiesXml: Future[Either[String, xml.Elem]] = {
val res: Future[Either[Throwable, xml.Elem]] = Http((facilitiesSvc) OK as.xml.Elem).either
for(exc <- res.left)
yield "Can't connect to facilities service: \n" +
exc.getMessage
}
これにより、次の結果が得られます。
Left(Can't connect to facilities service: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.)
上流の API は文字セットを送り返しておらず、それを取得するとき、Dispatch は XML が始まる前にバイト オーダー マークでそれを表示しています: <?xml version="1.0" encoding="utf-8"?>
.
Dispatch の以前のバージョンでは、次の方法でこの問題が解決されていることがわかります。
new Http apply(url(uri.toString).copy(defaultCharset = "iso-8859-1") as_str)
ただし、現在、Dispatch 0.10 でこれを機能させる方法がわかりません。返されたものを解析できるように、この応答に文字セットを設定するためのヒントはありますか?