使用Source.fromUrl时出现有效url错误



我正在尝试使用Source.fromURL从URL获取响应。我从文件中的数据生成URL(UTF-8(。其中一个生成的URL包含重音符号(https://ow-api.com/v1/stats/pc/EU/Aojhürlkue-2299/profile(。

使用httpie命令行工具或使用浏览器执行请求会给我正确的响应,但当我从scala代码(使用Source.fromURL(执行请求时,我会出现HTTP错误400。

http 'https://ow-api.com/v1/stats/pc/EU/Aojhürlkue-2299/profile'                                                                      
HTTP/1.1 200 OK
Connection: keep-alive
...

我用这个代码来完成请求:

def get(url: String) = scala.io.Source.fromURL(url)("utf-8").mkString
val teams = Util.get_teams.map { case (k, v) => (k, v.map(_.btag) ) }
.toArray
for((team, btags) <- teams) {
for(name <- btags) {
try {
Util.get(s"https://ow-api.com/v1/stats/pc/EU/$name/profile")
} catch {
case e: Throwable => println(s"$name -> $e")
}
}
}

我得到了一个例外:

Aojhürlkue-2299 -> java.io.IOException: Server returned HTTP response code: 400 for URL: https://ow-api.com/v1/stats/pc/EU/Aojhürlkue-2299/profile

我从UTF-8文件中获取数据:

$ file -i all-team.csv
all-team.csv: text/plain; charset=utf-8

为什么我从一个有效的URL得到这个错误(我从其他工具得到了正确的响应(?


编辑

这是我读取文件的代码:


def get_teams() =
CSVReader.open("all-team.csv", "UTF-8")
.all()
.map(a =>
TeamPlayer(a(0).replace('#', '-'),
a(1),
if(a(3) == "DPS") { "damage" } else { a(3).toLowerCase } ))
.groupBy(_.team)
.map{case (k, v) =>
(k, v.map{ case TeamPlayer(btag, _, role) => Player(role, btag) })}

底层Java类不会自动对元音变音符进行编码。

使用java.net.URI类可以做到这一点:

Source.fromURL(URI.create(url).toASCIIString)

BTW,你使用的所有其他工具都只是作弊。它们向您显示HTTP请求中的ü,但实际上,在发送时编码为%C3%BC

最新更新