Scala 2.13下com.netaporter.uri.Uri的替代方案问询
Scala 2.13 替代 com.netaporter scala-uri 的方案
以下是几个适配Scala 2.13的URI处理库,以及对应你原有代码的重构实现:
1. scala-url(轻量Scala专用库)
scala-url支持Scala 2.13及以上版本,API风格和原库接近,迁移成本低。
重构代码:
import io.lemonlabs.uri.Url import scala.util.Try val uri: Try[Url] = Try(Url.parse(record.url)) val addressForCall = uri.flatMap { address => // 显式检查host是否存在,避免get抛出异常 address.host match { case Some(host) => Try(address.withHost(host)) case None => Try.failed(new NoSuchElementException("URI has no host")) } }
注:原代码中address.host.get可能抛出NoSuchElementException,这里用模式匹配显式处理,逻辑和原代码一致,但更安全。
2. Java标准库 java.net.URI(无额外依赖)
如果不想引入新库,直接用Java标准库的URI类也能实现需求,缺点是API偏Java风格,但无需额外依赖。
重构代码:
import java.net.URI import scala.util.Try val uri: Try[URI] = Try(new URI(record.url)) val addressForCall = uri.flatMap { address => Try { val host = address.getHost if (host == null) throw new NoSuchElementException("URI has no host") // 重新构造URI,保留原有的scheme、path、query等,替换host new URI(address.getScheme, address.getUserInfo, host, address.getPort, address.getPath, address.getQuery, address.getFragment) } }
3. http4s Uri(适合http4s生态项目)
如果你的项目基于http4s框架,可以直接用它内置的Uri处理模块,支持Scala 2.13+,且和http4s生态无缝集成。
重构代码:
import org.http4s.Uri import scala.util.Try val uri: Try[Uri] = Uri.fromString(record.url).toTry val addressForCall = uri.flatMap { address => address.host match { case Some(host) => Try(address.copy(host = host)) case None => Try.failed(new NoSuchElementException("URI has no host")) } }
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

