2

私は次のURLを持っています:

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

念のために言っておきますが、これは、drexinが言ったようにjava.net.URIを使用して作成した小さなユーティリティヘルパーです。

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
    )
  }
}

そして私はそれをこのように使用します(playのコンソールから):

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

代わりに使用できます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 に答える
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

MavenCentralで利用できます。詳細はこちら:https ://github.com/theon/scala-uri

于 2013-01-27T12:27:23.673 に答える
0

構造に従ってURL(完全またはその他)を処理するためのPartialURLクラスを含む私のBeeClientAPIを試してみてください。

一般的な考え方は、文字列または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 に答える