2012-12-21 160 views
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

您可以使用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 
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 
0

你可能想尝试一下我的Bee Client API,其中包含了PartialURL类处理,根据其结构的网址(完整的或其他)。

一般的想法是从一个字符串或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)))) 
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 
+2

我真的很喜欢你如何利用case类的参数默认机制来创建一个只改变了一个参数的新URI。同样的机制适用于1..n个参数的任何变化。 – chaotic3quilibrium

+0

yeap,复制方法确实是一件好事... – opensas

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中心有售。详细信息在这里:https://github.com/theon/scala-uri