Akka-http传入URL变量调用Get方法报错非法URI如何解决
根本原因
- 你的
url字符串携带了不可见的特殊控制字符,从报错信息可以看到URL末尾带有\n换行符,部分场景下也可能是URL开头混入了零宽空格、UTF-8 BOM头这类肉眼不可见的字符,这些字符不会在常规打印中展示,但会导致Akka HTTP的URI解析器识别失败,触发格式校验报错。 - 其次是
Get方法的重载逻辑差异:直接传入字符串字面量时会调用Get(String)重载,内部会做基础的字符串预处理;如果你的url变量经过隐式转换提前转为Uri类型,转换逻辑没有处理特殊字符就会直接抛出异常。
解决方案
- 先对URL字符串做特殊字符清理,用
trim移除首尾空白、换行符,再配合正则过滤所有控制字符:
val cleanUrl = url.trim.replaceAll("[\\p{Cntrl}]", "") val getData = Get(cleanUrl)
- 建议显式完成URI解析,提前捕获异常方便后续排查:
import akka.http.scaladsl.model.Uri import akka.http.scaladsl.client.RequestBuilding.Get val url = "https://abcde-abcde.abcde.abcde.abcde.abcde.com/abcde" val uri = Uri(url.trim.replaceAll("[\\p{Cntrl}]", "")) val getData = Get(uri)
- 如果URL是从配置文件、外部接口等渠道读取的,建议增加格式校验逻辑,避免读取到带特殊字符的异常地址。
内容的提问来源于stack exchange,提问作者seriously divergent
相关产品推荐
相关产品推荐

