2

我有以下网址:

ws://chat-jugar.rhcloud.com/room/chat?username=felipe

我只想添加一个非默认端口,像这样

ws://chat-jugar.rhcloud.com:8000/room/chat?username=felipe

我首先尝试使用 java.net.URL 开始解析和操作 url,但我得到了

scala> val u = new java.net.URL("ws://chat-jugar.rhcloud.com/room/chat?username=felipe")
java.net.MalformedURLException: unknown protocol: ws
at java.net.URL.<init>(URL.java:592)
at java.net.URL.<init>(URL.java:482)
at java.net.URL.<init>(URL.java:431)

我不想乱用正则表达式,以免错过一些奇怪的情况(但如果没有其他选择也没关系,当然......)

最好的方法是什么?

4

5 回答 5

4

您可以使用java.net.URI提取到部分 uri,然后使用添加的端口构建新的 uri 字符串。例子:

val uri = URI.create("ws://chat-jugar.rhcloud.com/room/chat?username=felipe")

val newUriString = "%s://%s:%d%s?%s".format(uri.getScheme, uri.getHost, 8000, uri.getPath, uri.getQuery)

newUriString: String = ws://chat-jugar.rhcloud.com:8000/room/chat?username=felipe
于 2012-12-21T11:18:02.020 回答
4

仅作记录,这是我使用 java.net.URI 提出的小型实用程序助手,正如 drexin 所说

package utils.http

case class Uri(
  protocol: String, userInfo: String, 
  host: String, port: Int, 
  path: String, query: String, fragment: String
) {
  lazy val javaURI = {
    new java.net.URI(
      protocol, userInfo, 
      host, port, 
      path, query, fragment
    )
  }

  override def toString = {
    javaURI.toString
  }
}

object Uri {
  def apply(uri: String): Uri = {
    val parsedUri = new java.net.URI(uri)
    Uri(
      parsedUri.getScheme, parsedUri.getUserInfo,
      parsedUri.getHost, parsedUri.getPort,
      parsedUri.getPath, parsedUri.getQuery, parsedUri.getFragment
    )
  }
}

我像这样使用它(来自游戏的控制台):

scala> import utils.http.Uri
import utils.http.Uri

scala> Uri("ws://chat-jugar.rhcloud.com/room/chat?username=felipe").copy(port=8000).toString
res0: java.lang.String = ws://chat-jugar.rhcloud.com:8000/room/chat?username=felipe
于 2012-12-22T16:24:19.727 回答
1

派对迟到了,但你可以这样做scala-uri(免责声明:这是我自己的图书馆):

import com.github.theon.uri.Uri._

val uri = "ws://chat-jugar.rhcloud.com/room/chat?username=felipe"
val newUri = uri.copy(port = Some(8000))

newUri.toString //This is: ws://chat-jugar.rhcloud.com:8000/room/chat?username=felipe

它在 Maven Central 中可用。详细信息在这里:https ://github.com/theon/scala-uri

于 2013-01-27T12:27:23.673 回答
1

你可以java.net.URI改用。

def changePort(uri: java.net.URI, port: Int) = new java.net.URI(uri.getScheme, uri.getUserInfo, uri.getHost, port, uri.getPath, uri.getQuery, uri.getFragment)

接着

scala> changePort(new java.net.URI("ws://chat-jugar.rhcloud.com/room/chat?username=felipe"), 8000).toString
res: java.lang.String = ws://chat-jugar.rhcloud.com:80/room/chat?username=felipe
于 2012-12-21T11:18:41.810 回答
0

您可能想试试我的Bee Client API,它包含一个PartialURL类,用于根据其结构处理 URL(完整或其他)。

一般的想法是从字符串或 URL 构造一个,然后更改您需要的任何部分,例如

import uk.co.bigbeeconsultants.http.url._
val url = PartialURL("ws://chat-jugar.rhcloud.com/room/chat?username=felipe")
val url8080 = url.copy(endpoint = Some(url.endpoint.get.copy(port = Some(8080))))
于 2012-12-22T10:39:20.090 回答