You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:42:43